首页 > 数据库 > mysql教程 > MySQL中相关子查询如何替代CROSS APPLY?

MySQL中相关子查询如何替代CROSS APPLY?

Susan Sarandon
发布: 2024-12-05 01:33:22
原创
721 人浏览过

How Can Correlated Subqueries Replace CROSS APPLY in MySQL?

MySQL 中的 CROSS/OUTER APPLY

尽管是 T-SQL 中广泛使用的运算符,但 MySQL 本身并不支持 CROSS APPLY 语法。这对于需要在 MySQL 环境中利用 CROSS APPLY 功能的开发人员来说是一个挑战。

理解相关子查询

在 MySQL 中,一种近似 CROSS APPLY 功能的常见方法是使用相关子查询。相关子查询是引用外部查询中的列的子查询。通过在 SELECT 语句或联接条件中嵌入相关子查询,您可以获得与 CROSS APPLY 类似的结果。

示例 1:使用相关子查询作为谓词进行联接

考虑以下查询尝试使用 CROSS APPLY 从 ORD_HISTORY 检索特定值table:

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.ID
        =
        (SELECT ORD_HISTORY.ID
           FROM ORD_HISTORY
          WHERE ORD.ID = ORD_HISTORY.ID
            AND ORD.DATE <= ORD_HISTORY.DATE
       ORDER BY ORD_HISTORY.DATE DESC
          LIMIT 1
        )
登录后复制

在此查询中,相关子查询用于从 ORD_HISTORY 中获取适当的值并将其嵌入作为联接

示例2:在SELECT语句中直接使用关联子查询

如果只需要目标表中的单个字段,可以合并关联子查询直接进入 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
登录后复制

通过利用相关子查询,开发人员可以有效地近似 CROSS APPLY MySQL 中的功能,使它们即使在没有本机 CROSS APPLY 支持的情况下也能够执行复杂的数据检索操作。

以上是MySQL中相关子查询如何替代CROSS APPLY?的详细内容。更多信息请关注PHP中文网其他相关文章!

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