派生表可以在MySQL 8.0中作为相关子查询吗?

时间:2019-07-18 03:13:43

标签: 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中是不允许的
  • 这可以在MySQL 8.0中与LATERAL一起使用

父级 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中是允许的

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

0 个答案:

没有答案