PostgreSQL为什么可以在子查询WHERE中引用表别名但不引用FROM

时间:2016-08-10 23:03:41

标签: sql postgresql subquery

我想知道为什么FROM子句中对表别名的引用无效,但使用同一子查询中WHERE子句中的别名引用列是有效的。

以下是两个示例查询:第一个产生错误relation "t1" does not exist,但第二个有效:

SELECT * FROM(SELECT * FROM existing_table WHERE conditioncol < 1000) AS t1
WHERE EXISTS(SELECT 1 FROM t1 WHERE t1.conditioncol < existing_table.conditioncol + 50)


SELECT * FROM(SELECT * FROM existing_table WHERE conditioncol < 1000) AS t1
WHERE EXISTS(SELECT 1 FROM existing_table WHERE t1.conditioncol < existing_table.conditioncol + 50)

请注意,这两个查询的唯一区别在于,第一个查询中有FROM t1,而第二个查询在子查询中有FROM existing_table

1 个答案:

答案 0 :(得分:1)

您将表别名与限定列名混淆。

您在关联子句中引用的是名称。表别名区分了列的来源。

如果要在多个位置引用相同的子查询,请使用CTE:

with t as (
      select . . .
     )
select . . .
from t
where exists (select 1 from t t2 where . . . );