首页 > 解决方案 > 在 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

其他从父子 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
    )

我实际上没有运行任何这些查询,所以我可能完全错了。我希望有人可以检查我是否在正确的轨道上。

标签: mysqlmysql-8.0

解决方案


推荐阅读