Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL为什么可以在子查询WHERE中引用表别名,而不能从中引用_Sql_Postgresql_Subquery - Fatal编程技术网

PostgreSQL为什么可以在子查询WHERE中引用表别名,而不能从中引用

PostgreSQL为什么可以在子查询WHERE中引用表别名,而不能从中引用,sql,postgresql,subquery,Sql,Postgresql,Subquery,我想知道为什么在FROM子句中引用表别名是无效的,但在同一子查询中使用WHERE子句中的别名引用列是有效的 以下是两个查询示例:第一个查询生成的错误关系t1不存在,但第二个查询有效: SELECT * FROM(SELECT * FROM existing_table WHERE conditioncol < 1000) AS t1 WHERE EXISTS(SELECT 1 FROM t1 WHERE t1.conditioncol < existing_table.conditi

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

以下是两个查询示例:第一个查询生成的错误关系t1不存在,但第二个查询有效:

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)

请注意,这两个查询的唯一区别是第一个查询来自t1,而第二个查询来自子查询中的现有_表。

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

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

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

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

我正在从CTE转向尝试使用子查询,因为CTE是postgres中的优化屏障。另外,您是否介意详细说明为什么引用表别名无效,而引用使用该别名的列无效?@user3747260。我想我已经解释过了。支持外部列引用,但不支持仅外部表引用。是的,但我的问题是为什么会出现这种情况。这似乎是一个非常有意的设计决定,允许其中一个,但不允许另一个。@user3747260。这是一个非常有意的设计决策。有一种简单的方法可以使用CTE在查询中包含相同的表引用。没有包含外部列引用的方法。