Maison >base de données >tutoriel mysql >Comment répliquer la fonctionnalité CROSS/OUTER APPLY dans MySQL ?
CROSS/OUTER APPLY dans MySQL
MySQL ne prend pas en charge directement la syntaxe CROSS APPLY, mais des approches alternatives peuvent être utilisées pour obtenir des fonctionnalités similaires .
Imbriqué Sous-requête :
Dans MySQL, une alternative courante consiste à utiliser une sous-requête corrélée comme prédicat dans une instruction JOIN. Cela garantit que les résultats de la sous-requête sont évalués pour chaque ligne de la requête externe.
Exemple :
Étant donné la requête :
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
La requête équivalente utilisant une sous-requête imbriquée serait :
SELECT ORD.ID ,ORD.NAME ,ORD.DATE ,ORD_HISTORY.VALUE FROM ORD INNER JOIN ORD_HISTORY ON ORD_HISTORY.<PRIMARY_KEY> = (SELECT ORD_HISTORY.<PRIMARY_KEY> FROM ORD_HISTORY WHERE ORD.ID = ORD_HISTORY.ID AND ORD.DATE <= ORD_HISTORY.DATE ORDER BY ORD_HISTORY.DATE DESC LIMIT 1 )
Direct Sous-requête :
Dans les cas où un seul champ de la table cible est requis, une sous-requête corrélée peut être directement intégrée 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
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!