【问题标题】:subquery in FROM must have an aliasFROM 中的子查询必须有别名
【发布时间】:2013-01-23 21:39:34
【问题描述】:

我有一个我在 PostgreSQL 中编写的查询,它返回一个错误说:

[Err] 错误:
第 3 行:FROM (SELECT DISTINCT (identifiant) 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 中有一个类似的查询,效果很好。唯一的变化是我在 Oracle 中有 EXCEPT 的地方,我用 MINUS 关键字替换了它。我是 Postgres 的新手,不知道它要求什么。正确的处理方法是什么?

【问题讨论】:

  • 在我看来这个例外是不必要的,因为第一个 where 子句已经排除了它:CALLEDNUMBER = '0130'
  • Postgres 11 FWIW 仍然会出现此错误...

标签: sql oracle postgresql subquery


【解决方案1】:

在子查询中添加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

【讨论】:

  • @JohnWoo 谢谢你,但为什么需要它(我想我在这里问一个理论问题)?
  • @AndrewCassidy 您必须进行定义,以便能够在查询中添加更多约束(WHERE derivedTable. = 5)。否则你的数据库将不知道如何引用子查询
  • @AndrewCassidy 这只是不走运的语法。只要您不引用该子查询,它的别名是什么都没有关系。就个人而言,我使用AS pg_sucks,意思是“好吧,这里有一些冗余标识符,但你可以自己在内部生成一些,该死的postgres!” :)
  • @Tregoreg 我的别名总是包含某种具有相同效果的脏话。
【解决方案2】:

在嵌套表的情况下,一些 DBMS 要求使用别名,如 MySQL 和 Oracle,而另一些则没有这样严格的要求,但仍然允许添加它们以替换内部查询的结果。

【讨论】:

  • 您的措辞表明对 Oracle 和 MySQL 都有这样的要求。我读对了吗?
  • @Scratte 我认为你是对的,并且措辞已经改变。 “MySQL and Oracle but others”应该是“Postgresql, but other ssuch as MySQL and Oracle”我认为。当然,这仍然是一个连续的句子,并且可以进一步改进。 2013 年的答案很好,这个答案什么也没增加(如果必须的话,请评论 2013 年的答案),所以后者应该被删除。
  • mysql 确实需要别名
猜你喜欢
  • 2017-12-29
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多