我非常熟悉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(*)为"minCounter“
我的错误只是调整为:
ERROR: column c.mincounter does not exist
LINE 4: c.minCounter对于我遗漏了哪些语法或一般的命名差异,有什么建议吗?
(注意,我不确定我们正在运行的PostgreSQL版本是什么版本,因为它被我们的外部开发团队混淆了)。
谢谢!
发布于 2014-02-12 18:22:48
这与引用列无关,而是与提供列的别名有关。
'minCounter'不是列别名,而是字符文字。如果要引用标识符,则必须使用双引号:"minCounter"
详细信息,请参阅手册:http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
这按照SQL标准的指定和要求工作( MySQL选择忽略该标准,并不真正区分使用单引号的字符文本和使用双引号的对象标识符)。
一旦使用双引号引用标识符,它就会区分大小写.因此,在您的外部查询中,您还需要"minCounter",因为minCounter是一个不同的名称(这也是根据MySQL的标准(您猜到了这个标准也被MySQL忽略)。
总结一下:
一般来说,我强烈建议永远不要引用任何标识符
https://stackoverflow.com/questions/21736208
复制相似问题