【问题标题】:Referencing subquery columns in PostgreSQL在 PostgreSQL 中引用子查询列
【发布时间】:2014-02-12 18:14:45
【问题描述】:

我非常熟悉 MySQL 语法,但在迁移到 PostgreSQL 环境时似乎遇到了一些成长的烦恼。在 MySQL 中,您可以轻松引用连接子查询中的列,但在 PostgreSQL 中我会出错。

例如:

SELECT
  a.userID,
  b.firstname,
  c.minCounter
FROM users a
JOIN users_info b ON (a.userID = b.userID)
LEFT JOIN (
   SELECT
      user_id,
      COUNT(*) AS 'minCounter'
   FROM sales
   WHERE
      total_amount > 500
   GROUP BY user_id
) as c ON (b.userID = c.user_id)

引用子查询“c”及其临时列“minCounter”没有问题。然而,在 PostgreSQL 中,类似的查询会返回错误:

ERROR:  syntax error at or near "'minCounter'"
LINE 10:   COUNT(*) AS 'minCounter'

考虑文字列与命名列

如果我将第 10 行切换为状态:COUNT(*) AS "minCounter"

我的错误只是调整为:

ERROR:  column c.mincounter does not exist
LINE 4: c.minCounter

关于我缺少什么语法或一般命名差异的任何建议?

(注意,我不确定我们运行的是哪个版本的 PostgreSQL,因为它被我们的外部开发团队混淆了)。

谢谢!

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    这与引用列无关,而是为列提供别名。

    'minCounter' 不是列别名,它是字符文字。如果要引用标识符,则必须使用双引号:"minCounter"

    详见说明书:http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

    这按照 SQL 标准的规定和要求工作(MySQL 选择忽略它,并且没有真正区分使用单引号的字符文字和使用双引号的对象标识符)。

    一旦使用双引号引用标识符,它就会区分大小写。因此,在您的外部查询中,您还需要 "minCounter",因为 minCounter 是一个不同的名称(这又是根据 SQL 标准 - 你猜到 - 也被 MySQL 忽略了)

    总结一下:

    • 没有引号:不区分大小写的标识符(或关键字,或运算符,...)
    • 双引号:区分大小写敏感标识符
    • 单引号:一个常量字符值(又名“字符文字”)

    一般来说,我强烈建议不要引用任何标识符

    【讨论】:

    • 也试过了。我应该在我的 OP 中提到-我会更新,因为错误是不同的,但仍然抛出了
    • @JM4:查看我的编辑。您的标识符 "minCounter" 与外部查询中名为 minCounter 的引用不同
    • 谢谢@a_horse_with_no_name - 我现在遇到了来自其他连接的 GROUP BY 错误,但我可以在其他地方使用或找出:错误:列“c.mincounter”必须出现在 GROUP BY 子句中或用于聚合函数第 4 行:q.minCounter
    • @JM4:你又一次陷入了一个陷阱,MySQL 忽略了 SQL 标准并错误地实现了组:mysqlperformanceblog.com/2006/09/06/…
    • 听起来我需要重新学习正确的 SQL 并告诉 MySQL 咬紧牙关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2020-08-28
    • 2021-01-19
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多