为什么我们不能在子查询中使用/引用派生表

时间:2020-02-18 16:31:34

标签: sql

我想知道子查询为何即使可以访问派生表(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

2 个答案:

答案 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

希望这对您有帮助...

相关问题