Maison > base de données > tutoriel mysql > Comment les sous-requêtes corrélées peuvent-elles remplacer CROSS APPLY dans MySQL ?

Comment les sous-requêtes corrélées peuvent-elles remplacer CROSS APPLY dans MySQL ?

Susan Sarandon
Libérer: 2024-12-05 01:33:22
original
722 Les gens l'ont consulté

How Can Correlated Subqueries Replace CROSS APPLY in MySQL?

CROSS/OUTER APPLY dans MySQL

Bien qu'il s'agisse d'un opérateur largement utilisé dans T-SQL, MySQL ne prend pas en charge nativement la syntaxe CROSS APPLY . Cela peut présenter un défi pour les développeurs qui doivent utiliser les capacités de CROSS APPLY dans les environnements MySQL.

Comprendre les sous-requêtes corrélées

Dans MySQL, une approche commune pour rapprocher les fonctionnalités de CROSS APPLY consiste à utiliser des sous-requêtes corrélées. Une sous-requête corrélée est une sous-requête qui fait référence aux colonnes de la requête externe. En intégrant une sous-requête corrélée dans une instruction SELECT ou une condition de jointure, vous pouvez obtenir des résultats similaires à CROSS APPLY.

Exemple 1 : Joindre avec une sous-requête corrélée en tant que prédicat

Considérez la requête suivante, qui tente d'utiliser CROSS APPLY pour récupérer une valeur spécifique de ORD_HISTORY table :

SELECT ORD.ID
    ,ORD.NAME
    ,ORD.DATE
    ,ORD_HIST.VALUE
FROM ORD
CROSS APPLY (
    SELECT TOP 1 ORD_HISTORY.VALUE
    FROM ORD_HISTORY
    WHERE ORD.ID = ORD_HISTORY.ID
        AND ORD.DATE <= ORD_HISTORY.DATE
    ORDER BY ORD_HISTORY.DATE DESC
    ) ORD_HIST
Copier après la connexion

En raison du manque de support CROSS APPLY par MySQL, une approche plus appropriée consiste à utiliser une jointure avec une sous-requête corrélée comme prédicat :

SELECT
   ORD.ID
  ,ORD.NAME
  ,ORD.DATE
  ,ORD_HISTORY.VALUE
FROM
  ORD
INNER JOIN
  ORD_HISTORY
    ON  ORD_HISTORY.ID
        =
        (SELECT ORD_HISTORY.ID
           FROM ORD_HISTORY
          WHERE ORD.ID = ORD_HISTORY.ID
            AND ORD.DATE <= ORD_HISTORY.DATE
       ORDER BY ORD_HISTORY.DATE DESC
          LIMIT 1
        )
Copier après la connexion

Dans cette requête, la sous-requête corrélée est utilisée pour récupérer la valeur appropriée de ORD_HISTORY et l'intégrer en tant que jointure condition.

Exemple 2 : Utilisation d'une sous-requête corrélée directement dans l'instruction SELECT

Dans les cas où un seul champ de la table cible est requis, la sous-requête corrélée peut être incorporée directement dans l'instruction SELECT :

SELECT
   ORD.ID
  ,ORD.NAME
  ,ORD.DATE
  ,(SELECT ORD_HISTORY.VALUE
      FROM ORD_HISTORY
     WHERE ORD.ID = ORD_HISTORY.ID
       AND ORD.DATE <= ORD_HISTORY.DATE
  ORDER BY ORD_HISTORY.DATE DESC
     LIMIT 1
   )   AS VALUE
FROM
  ORD
Copier après la connexion

En exploitant les sous-requêtes corrélées, les développeurs peuvent se rapprocher efficacement de la fonctionnalité CROSS APPLY dans MySQL, permettant leur permettant d'effectuer des opérations complexes de récupération de données même en l'absence de support natif CROSS APPLY.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal