mariadb 多个嵌套子查询访问外部表列?

nom7f22z  于 7个月前  发布在  其他
关注(0)|答案(1)|浏览(78)

在mariadb中(但我想同样适用于mysql),我有以下查询:

select 
tblrelation.id,
(     
      select count(C.id) 
      from tblcontract C 
      where C.relation_id IN(
            (
                select B.relation_id from tblrelation_branch B where B.parent_id = tblrelation.id
                union 
                select B.parent_id from tblrelation_branch B where B.relation_id = tblrelation.id
                union 
                select tblrelation.id
           ) 

      )
) as qty   

from tblrelation

此查询工作正常。
我的问题是关于“tblrelation.id“在这个例子中的双重嵌套查询中的用法。
我读到“MySQL禁止引用比嵌套层次更深的外层列”参考:https://dba.stackexchange.com/questions/198455/user-parent-table-id-in-nested-subquery
在其他地方,我读到“不可能从派生表访问外部表(简化一点,这是任何需要别名的“子查询”),ref:https://dba.stackexchange.com/questions/198455/user-parent-table-id-in-nested-subquery
有没有人能给我解释一下mariaDb和Mysql的规则(如果它们不同的话),当一个(n级嵌套子查询)可以访问(最外层的)表时,什么时候不能?

e5nqia27

e5nqia271#

有没有人能给我解释一下mariaDb和Mysql的规则(如果它们不同的话),当一个(n级嵌套子查询)可以访问(最外层的)表时,什么时候不能?
SQL是一种声明性语言。这意味着处理查询的顺序与处理查询文本的顺序不同。
在你的特别询问中。服务器可能会在嵌套的子查询执行上循环-在这种情况下,您将有双重嵌套引用,并且查询将由于未知的标识符而失败。但是服务器可能会优化查询执行,并将内部UNION划分为3个单独的子查询,并在外部(UNION)或中间(OR)执行级别组合。在这种情况下,从外部表中选择值是一个常量,多余的嵌套级别将被删除,从而导致正确的查询执行。
此外,表统计信息的变化可能导致执行计划的改变,并且先前成功执行的查询可能在某个时候失败。您无法预测在执行计划构建期间将处理还是删除嵌套级别。所以你一定认为这是不可能的。

相关问题