我想知道为什么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
。
答案 0 :(得分:1)
您将表别名与限定列名混淆。
您在关联子句中引用的是列名称。表别名区分了列的来源。
如果要在多个位置引用相同的子查询,请使用CTE:
with t as (
select . . .
)
select . . .
from t
where exists (select 1 from t t2 where . . . );