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

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

Barbara Streisand
发布: 2024-12-09 11:01:06
原创
849 人浏览过

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
        )
登录后复制

如果像本例一样,只需要目标表中的单个字段,则联接with子查询可以省略,子查询可以直接放在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类似的功能在不影响查询准确性或效率的情况下进行申请。

以上是如何复制 MySQL 中的 CROSS APPLY 功能?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板