如何使用GROUP BY子句将查询移植到PostgreSQL? [英] How do I port query with GROUP BY clause to PostgreSQL?

查看:70
本文介绍了如何使用GROUP BY子句将查询移植到PostgreSQL?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将一个简单的费用数据库移植到Postgres,并使用 GROUP BY 和多个 JOIN 子句。我认为Postgres希望我使用 GROUP BY 子句中的所有表。



表定义在最后。请注意,列 account_id receiving_account_id place 可能 NULL 操作可以有0个标签。

CREATE 语句



  CREATE VIEW细节AS SELECT 
op。 id,
op.name,
c.name,
CASE --amountsign
当op.receiving_account_id不为空时,那么
CASE
当操作。 account_id IS NULL THEN'+'
ELSE'='
END
ELSE' - '
END || ''|| printf(%2f,op.amount)|| 'zł'AS金额,
CASE - 帐户
当op.receiving_account_id不为NULL时
CASE
当op.account_id为NULL时则为ac2.name
ELSE ac.name || ' - > '|| ac2.name
END
ELSE ac.name
END AS帐户,
t.name AS类型
CASE - 日期
当操作时间不为NULL然后op.date || ''|| op.time
ELSE op.date
END AS日期,
p.name AS位置,
GROUP_CONCAT(tag.name,',')AS标签
FROM操作op
LEFT JOIN类别c ON op.category_id = c.id
LEFT JOIN类型t ON op.type_id = t.id
LEFT JOIN帐号ac ON op.account_id = ac.id
LEFT JOIN帐户ac2 ON op.receiving_account_id = ac2.id
LEFT JOIN位置p ON op.place_id = p.id
LEFT JOIN operation_tag ot ON op.id = ot.operation_id
LEFT JOIN标记ON ot.tag_id = tag.id
GROUP BY IFNULL(ot.operation_id,op.id)
ORDER BY日期DESC



Postgres中的当前查询



我做了一些更新,当前语句为:

  BEGIN TRANSACTION; 
CREATE VIEW细节AS SELECT
op.id,
op.name,
c.name,
CASE --amountsign
当op.receiving_account_id IS NOT NULL THEN
CASE
当op.account_id IS NULL THEN'+'
ELSE'='
END
ELSE' - '
END || ''|| op.amount || 'zł'AS金额,
CASE - 帐户
当op.receiving_account_id不为NULL时
CASE
当op.account_id为NULL时则为ac2.name
ELSE ac.name || ' - > '|| ac2.name
END
ELSE ac.name
END AS帐户,
t.name AS类型
CASE - 日期
当操作时间IS NOT NULL THEN to_char(op.date,'DD.MM.YY')|| ''|| op.time
ELSE to_char(op.date,'DD.MM.YY')
END AS日期,
p.name AS位置,
STRING_AGG(tag.name, ',')AS标签
FROM操作
LEFT JOIN类别c ON op.category_id = c.id
LEFT JOIN类型t ON op.type_id = t.id
LEFT JOIN帐户AC ON op.account_id = ac.id
LEFT JOIN帐户ac2 ON op.receiving_account_id = ac2.id
LEFT JOIN地方p ON op.place_id = p.id
LEFT JOIN operation_tag ot ON op.id = ot.operation_id
LEFT JOIN标记ON ot.tag_id = tag.id
GROUP BY COALESCE(ot.operation_id,op.id)
ORDER BY date DESC;
COMMIT;

这里我得到列'x'必须出现在GROUP BY子句中错误,因为我添加了列表:

  GROUP BY COALESCE(ot.operation_id,op.id),op .id,c.name,ac2.name,ac.name,t.name,p.name 

当我添加 p.name 列时,我得到列'p.name'被多次定义错误。 How我是否修复这个问题?



表定义



  CREATE TABLE操作
整数NOT NULL PRIMARY KEY,
名称字符变化(64)NOT NULL,
category_id整数NOT NULL,
type_id整数NOT NULL,
数值数字(8) ,2)NOT NULL,
日期日期NOT NULL,
时间没有时区的时间NOT NULL,
place_id整数,
account_id整数,
receiving_account_id整数,
CONSTRAINT categories_transactions FOREIGN KEY(category_id)
REFERENCES类别(id)MATCH SIMPLE
ON UPDATE NO A CTION ON DELETE NO ACTION,
CONSTRAINT transactions_accounts FOREIGN KEY(account_id)
REFERENCES account(id)MATCH SIMPLE
ON UPDATE NO ACTION ON ACTION,
CONSTRAINT transactions_accounts_second FOREIGN KEY (ID)匹配SIMPLE
参考帐户(id)MATCH SIMPLE
更新没有行动ON DELETE NO ACTION,
CONSTRAINT transactions_places FOREIGN KEY(place_id)
REFERENCES place(id)MATCH SIMPLE
ON UPDATE NO ACTION ON ACTION,
CONSTRAINT transactions_transaction_types FOREIGN KEY(type_id)
REFERENCES type(id)MATCH SIMPLE
ON UPDATE NO ACTION ON ACTION
) ;


解决方案

@ Andomar已经提供了:大多数RDBMS需要按每个出现未聚集的列进行分组 - 查询中的任何其他位置(包括 SELECT 列表,而且也在 WHERE 子句中。)




  • < a href =https://stackoverflow.com/questions/8684486/pgerror-error-aggregates-not-allowed-in-where-clause-on-a-ar-query-of-an-objec/8684512#8684512 > PGError:错误:不允许在对象的AR查询和其has_many对象的WHERE子句中聚合



SQL标准还定义 GROUP BY 子句中的表达式也应涵盖功能相关的表达式。 Postgres实现了 PK列覆盖同一张表的所有列



查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆