FROM中的子查询必须具有别名


91

我有我在PostgreSQL中编写的查询,该查询返回错误消息:

[Err]错误:第
3行:从(选择不同(可识别)AS AS_made_only_recharge

这是整个查询:

SELECT COUNT (made_only_recharge) AS made_only_recharge
FROM (
    SELECT DISTINCT (identifiant) AS made_only_recharge
    FROM cdr_data
    WHERE CALLEDNUMBER = '0130'
    EXCEPT
    SELECT DISTINCT (identifiant) AS made_only_recharge
    FROM cdr_data
    WHERE CALLEDNUMBER != '0130'
)

我在Oracle中有一个类似的查询,工作正常。唯一的变化是我EXCEPT在Oracle中的位置已用MINUS关键字替换。我是Postgres的新手,不知道它要什么。处理此问题的正确方法是什么?


3
在我看来,该例外是不必要的,因为第一个where子句已经除外:CALLEDNUMBER = '0130'
Clodoaldo Neto

Postgres 11 FWIW ...仍然会发生此错误...
rogerdpack

Answers:


133

ALIAS在子查询上添加一个

SELECT  COUNT(made_only_recharge) AS made_only_recharge
FROM    
    (
        SELECT DISTINCT (identifiant) AS made_only_recharge
        FROM cdr_data
        WHERE CALLEDNUMBER = '0130'
        EXCEPT
        SELECT DISTINCT (identifiant) AS made_only_recharge
        FROM cdr_data
        WHERE CALLEDNUMBER != '0130'
    ) AS derivedTable                           -- <<== HERE

18
@JohnWoo对此表示感谢,但是为什么需要它(我想我在这里问一个理论问题)?
Andrew Cassidy 2015年

@AndrewCassidy您必须进行定义,以便能够在查询中添加更多约束(WHERE派生表。<attribute> = 5)。否则,您的数据库将不知道如何引用子查询
stackhelper101

35
@AndrewCassidy这只是不幸的语法。只要您不引用该子查询,别名是什么都没有关系。就我个人而言,我使用的AS pg_sucks意思是“好吧,这里您有一些多余的标识符,但是您可以自己在内部生成一些,该死的postgres!” :)
Tregoreg 2015年

1

对于嵌套表,某些DBMS要求使用别名,例如MySQL和Oracle,但其他DBMS则没有这样严格的要求,但仍允许添加它们以替代内部查询的结果。


1
你的措辞表明有支持Oracle和MySQL这样的要求。我看得对吗?
刮擦

@Scratte我认为您是对的,措辞已被改正。我认为“ MySQL和Oracle但其他”应该是“ Postgresql,但其他诸如MySQL和Oracle之类的”。当然,这仍然是句句惯用语,可以进一步改进。2013年的答案很好,并且此答案没有添加任何内容(如果需要,请在2013年答案中添加注释),因此应删除后者。
有限赎罪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.