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