ホームページ >データベース >mysql チュートリアル >MySQL で CROSS APPLY 機能をレプリケートするにはどうすればよいですか?

MySQL で CROSS APPLY 機能をレプリケートするにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-09 11:01:06847ブラウズ

How to Replicate CROSS APPLY Functionality in MySQL?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。