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中文网其他相关文章!