我想知道子查询为何即使可以访问派生表(Query1)的属性,也不能将派生表用作其派生表(Query2)?
Query1
select B.col1, col2 from dummy B
where B.col1 = (select col1 from dummy A where B.col1 = 'aa' and A.col1 = B.col1 limit 1);
在这里我们可以使用B.col1。
Query2
select B.col1, col2 from dummy B
where B.col1 = (select col1 from B where B.col1 = 'aa' limit 1);
这里我们不能使用B。错误提示B不存在。
您可以找到sqlfiddle here。
答案 0 :(得分:2)
因为第一个参考是一个相关参考。表别名是对查询中表的特定“实例”的引用,而不是对另一个“表”本身的引用。
如果您需要该功能,请使用CTE:
with b as (
select d.*
from dummy d
)
然后,您可以在随后的查询中多次使用b
。
答案 1 :(得分:1)
问题在于,在第二个查询中,您试图从不存在的表中进行选择,而在第一个查询中,您引用了存在的表。
在两个查询中,B和A字母只是别名而不是表。 考虑到这一点,让我们在第二个查询中删除别名:
select col1, col2 from dummy
where col1 = (select col1 from where col1 = 'aa' limit 1);
您现在在查询结构中看到什么丢失了吗?
最后,从您的问题看来,您似乎不了解哪个B是问题。这个:FROM B
,而不是这个where B.col1
。
希望这对您有帮助...