我想知道为什么在 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
。
最佳答案
您混淆了表别名和限定的列名。
您在关联子句中引用的是列 名称。表别名区分列的来源。
如果你想在多个地方引用相同的子查询,那么使用 CTE:
with t as (
select . . .
)
select . . .
from t
where exists (select 1 from t t2 where . . . );
关于sql - PostgreSQL 为什么可以在子查询 WHERE 中引用表别名而不是 FROM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38884915/