首页 >数据库 >mysql教程 >如何复制 MySQL 中的 CROSS/OUTER APPLY 功能?

如何复制 MySQL 中的 CROSS/OUTER APPLY 功能?

DDD
DDD原创
2024-12-07 13:07:16486浏览

How to Replicate CROSS/OUTER APPLY Functionality in MySQL?

MySQL 中的 CROSS/OUTER APPLY

MySQL 缺乏对 CROSS APPLY 语法的直接支持,但可以采用替代方法来实现类似的功能.

嵌套子查询:

在 MySQL 中,一种常见的替代方法是使用相关子查询作为 JOIN 语句中的谓词。这可确保针对外部查询中的每一行评估子查询的结果。

示例:

给定查询:

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

使用嵌套子查询的等效查询将为:

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
        )

直接子查询:

如果只需要目标表中的单个字段,可以直接进行关联子查询集成到 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/OUTER APPLY 功能?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn