sql - PostgreSQL 为什么可以在子查询 WHERE 中引用表别名而不是 FROM

标签 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

最佳答案

您混淆了表别名和限定的列名。

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

如果你想在多个地方引用相同的子查询,那么使用 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/

相关文章:

SQL Server 整数与十进制 SUM

sql - 为表的所有列动态更新特殊字符列?

SQL获取满足提款标准的未偿余额总额

sql - Excel数据透视表sql中的别名错误

MySql 用 SUM() 缓慢连接结果

mysql - 删除两个连接的 MySQL 表中除 X 个最新条目之外的所有条目

sql - 将字符串行拆分为多列 - PostgreSQL

sql - 如何确认数据库是 Postgres 以及它使用 SQL 的版本?

sql - 在 postgres 中调整子查询

sql - Objective C错误: "can' t locate the database".如何解决?