【问题标题】:PostgreSQL why can table aliases be referenced inside subquery WHERE but not FROMPostgreSQL为什么可以在子查询WHERE中引用表别名而不是FROM
【发布时间】:2016-08-10 23:03:40
【问题描述】:

我想知道为什么在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

【问题讨论】:

    标签: sql postgresql subquery


    【解决方案1】:

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

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

    如果您想在多个地方引用同一个子查询,请使用 CTE:

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

    【讨论】:

    • 我正在从 CTE 转向尝试使用子查询,因为 CTE 是 postgres 中的优化栅栏。另外,您是否介意详细说明为什么引用表别名无效但使用该别名引用列是有效的?
    • @user3747260 。 . .我以为我已经解释过了。支持 outer 列引用,但不支持 outer 仅表引用。
    • 是的,但我的问题是为什么会出现这种情况。允许一个但不允许另一个似乎是一个非常有意的设计决定。
    • @user3747260 。 . .这是一个非常有意的设计决定。有一种简单的方法可以在查询中包含相同的“表”引用(使用 CTE)。无法包含外部列引用。
    猜你喜欢
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多