现做一项目,之前是使用 mysql,现在改为使用 pg。
在没改数据库之前,一切查询都是很正常的,改了之后就发现很多问题,然后一直纠结这些问题。 比如现有一条简化版的查询
ProOutStock.select("fitting_barcode").group("fitting_item_id")
在 mysql 数据库是可以执行的(我直接在数据库下执行命令,因为是描述问题,所以没有带数据)
mysql> select fitting_barcode from pro_out_stocks group by fitting_item_id;Empty set (0.00 sec)
mysql>
在 pg 中是这样的
repair_facility=# select fitting_barcode from pro_out_stocks group by fitting_item_id;
ERROR: column "pro_out_stocks.fitting_barcode" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: select fitting_barcode from pro_out_stocks group by fitting_...
^
repair_facility=#
就直接报错了,然后我就上 stackoverflow 查相关问题。 然后查到说是 mysql 并不是完全严格的执行 sql 的标准。 这个 fitting_barcode 可能在 fitting_item_id 一样的的情况下出现不同的内容,所以 pg 才会出现报错,然后他们就提议使用 DISTINCT ON 来解决该问题,所以我执行
repair_facility=# select DISTINCT ON (fitting_barcode) fitting_barcode from pro_out_stocks group by fitting_item_id;
ERROR: column "pro_out_stocks.fitting_barcode" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: select DISTINCT ON (fitting_barcode) fitting_barcode from pr...
^
repair_facility=#
问题依然存在,这个时候或许有人说既然 fitting_barcode 是都是一样的,就提议在 groub by 中加入 fitting_barcode 输出如下
ProOutStock.select("fitting_barcode").group("fitting_item_id, fitting_barcode")
repair_facility=# select DISTINCT ON (fitting_barcode) fitting_barcode from pro_out_stocks group by fitting_item_id, fitting_barcode;
fitting_barcode
-----------------
(0 rows)
repair_facility=#
也许上面这个是可以查询出来的,但是问题是我实际应用可能不止那么简单的查询,比如 我的查询可能是下面这样的或者更复杂包括 sum, where,having 什么的 比如下面这个
ProOutStock.select("fitting_barcode,fitting_name, SUM(price_int) AS prices, .......").group("fitting_item_id, company_id")
我这里将("fitting_item_id,company_id")一样的数据的 price_int SUM 出来。 因为这事我已经弄了 2 天了,还没解决,所以现在有点迷茫。
所以不知道有没有对 postgresql 比较熟悉的来解答一下我该如何解决这个问题呢?