ホームページ >データベース >mysql チュートリアル >MySQL で CROSS APPLY 機能をレプリケートするにはどうすればよいですか?
MySQL の CROSS/OUTER APPLY
MySQL は CROSS APPLY 構文をネイティブにサポートしていないため、特定の操作を実行しようとするときに問題が発生する可能性があります。この質問は、次の CROSS APPLY クエリと同等の MySQL を見つけることを中心としています:
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
MySQL には直接の CROSS APPLY サポートがありませんが、その機能を実現する別の方法があります。最も近い近似は、以下に示すように、相関サブクエリを結合クエリの述語として使用することです。
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 )
この場合のように、ターゲット テーブルの 1 つのフィールドのみが必要な場合、結合はwith subquery は省略でき、サブクエリは 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
これらのアプローチを使用することで、MySQL ユーザーは次のことを実現できます。クエリの精度や効率を損なうことなく、CROSS APPLY と同様の機能を実現します。
以上がMySQL で CROSS APPLY 機能をレプリケートするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。