mysql - 在 MySQL 8.0 中,派生表可以是相关子查询吗?
问题描述
我一直认为子查询只是嵌套在另一个查询中的查询。
并且相关子查询是使用外部查询中的列的子查询。
我认为这里的文档似乎支持这个想法。
https://dev.mysql.com/doc/refman/8.0/en/correlated-subqueries.html
现在,让我感到困惑的部分。
我正在读这个,
https://dev.mysql.com/doc/refman/8.0/en/derived-tables.html
具体来说,
派生表不能是相关子查询。
和,
在 MySQL 8.0.14 之前,派生表不能包含外部引用。这是 MySQL 8.0.14 中取消的 MySQL 限制,而不是 SQL 标准的限制。例如,以下查询中的派生表 dt 包含对外部查询
t1.b
中表的引用:t1
SELECT * FROM t1 WHERE t1.d > (SELECT AVG(dt.a) FROM (SELECT SUM(t2.a) AS a FROM t2 WHERE t2.b = t1.b GROUP BY t2.c) dt WHERE dt.a > 10);
它说派生表不能是相关子查询。因此,它不能使用外部查询中的列。
然后,它说限制被解除,它可以使用外部查询中的列。
我在这里误解/误读了什么吗?
[编辑]
我对此进行了更多思考,我想我明白了它在说什么。(不太确定)。
所以,我认为有两种派生表作为相关子查询。
一个从同一 FROM/JOIN
子句引用表。
SELECT
*
FROM
sameFromClauseTable
JOIN
--This derived table references `sameFromClauseTable.sameFromClauseColumn`
(
SELECT
*
FROM
innerTable
WHERE
--This expression references `sameFromClauseTable.sameFromClauseColumn`
sameFromClauseTable.sameFromClauseColumn > innerTable.innerColumn
) AS derivedTable
- 这在 MySQL 5.7 中是不允许的
- 这在 MySQL 8.0 中是不允许的
- 这可以
LATERAL
在 MySQL 8.0 中使用
其他从父子 FROM/JOIN
句引用表。
SELECT
*
FROM
parentQueryTable
WHERE
--This is a subquery
EXISTS (
SELECT
*
FROM
--This derived table references `parentQueryTable.parentQueryColumn`
(
SELECT
*
FROM
innerTable
WHERE
--This expression references `parentQueryTable.parentQueryColumn`
parentQueryTable.parentQueryColumn > innerTable.innerColumn
) AS derivedTable
)
- 这在 MySQL 5.7 中是不允许的
- 这在 MySQL 8.0 中是允许的
我实际上没有运行任何这些查询,所以我可能完全错了。我希望有人可以检查我是否在正确的轨道上。
解决方案
推荐阅读
- django - 定制鹡鸰流域
- json - 将 ServiceStack 默认格式更改为 JSON,但保留 SwaggerUI 的 HTML 格式
- xcode - Xcode - 如果单击文件,则查找现有选项卡而不是始终打开新选项卡
- java - 打印到 PDF 文件 JavaFX
- python - OSM 版本的 gmplot
- unit-testing - Mocha 文件执行顺序和异步代码
- r - 复制矩阵的列而不更改行
- android - 所有 com.android.support 库必须使用相同版本的 appcompat-v7:28.0.0
- reactjs - React-Day-Picker 弹出位置
- gams-math - GAMS - 单位阶跃函数