CROSS/OUTER APPLY dans MySQL
MySQL ne prend pas en charge nativement la syntaxe CROSS APPLY, ce qui peut être un défi lorsque vous tentez d'effectuer certaines opérations . Cette question consiste à trouver un équivalent MySQL à la requête CROSS APPLY suivante :
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
Bien que MySQL ne prenne pas en charge directement CROSS APPLY, il existe d'autres moyens d'obtenir ses fonctionnalités. L'approximation la plus proche consiste à utiliser une sous-requête corrélée comme prédicat dans une requête de jointure, comme indiqué ci-dessous :
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 )
Si, comme dans ce cas, un seul champ de la table cible est nécessaire, la jointure with sous-requête peut être omis et la sous-requête peut être placé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
En utilisant ces approches, les utilisateurs de MySQL peuvent obtenir des fonctionnalités similaires à CROSS POSTULER sans compromettre l'exactitude ou l'efficacité de leurs requêtes.
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!