错误:Id必须出现在group by子句中,Postgresql?

问题描述 投票:0回答:1

我有以下sql

SELECT *, min(okd.position) FROM

-- all deals
(SELECT * FROM "Deals" as d
WHERE (d.active = true) AND (d.latitude BETWEEN 40 AND 41) AND (d.longitude BETWEEN -75 AND -70)) AS okd

LEFT JOIN

-- used deals
(SELECT * FROM "Deals" as ad INNER JOIN
  (SELECT * FROM "DealsUsed" AS du WHERE du."CustomerId" = 1) AS rd
ON rd."DealId" = ad.id) as dd

--deals that were not used, grouped by user and sorted by position
ON dd."UserId" = okd."UserId" AND dd.position = okd.position
WHERE dd.id IS NULL
GROUP BY okd."UserId";

对我来说,它看起来像有效的SQL

sql postgresql sequelize.js
1个回答
2
投票

SELECT *的意思是“从FROM条款中涉及的表格中给我所有列”。我认为它不仅仅是UserId,还包括其他一些列。哪个?不能说,因为你SELECT * FROM "Deals"。考虑在任何地方避免使用SELECT *,但需要快速和肮脏的测试目的。

因此,要么在GROUP BY子句中枚举所有这些(你可能不想要),要么SELECT只有UserId和聚合列;例如,

select okd."UserId", min(okd.position) 
FROM (your current FROM clause)
group by okd."UserId"

[编辑,基于Oracle(正如我所知),但也适用于您的数据库]

看看下面的例子:

这项工作正常 - 我正在选择在这些部门工作的所有员工的部门编号和工资总额:

SQL> select deptno, sum(sal)
  2  from emp
  3  group by deptno
  4  order by deptno;

    DEPTNO   SUM(SAL)
---------- ----------
        10       8750
        20       6775
        30       9400

我也想包括工作,即每个部门和工作的工资总额。如果我在SELECT中包含一个新列但在GROUP BY中没有它,那么它将失败:

SQL> select deptno, job, sum(sal)
  2  from emp
  3  group by deptno
  4  order by deptno;
select deptno, job, sum(sal)
               *
ERROR at line 1:
ORA-00979: not a GROUP BY expression

因此,您有两种选择:

  • 一种是恢复到第一个查询(即删除JOB并只有DEPTNO),或者
  • 在GROUP BY子句中包含其他列

SQL> select deptno, job, sum(sal)
  2  from emp
  3  group by deptno, job
  4  order by deptno, job;

    DEPTNO JOB         SUM(SAL)
---------- --------- ----------
        10 CLERK           1300
        10 MANAGER         2450
        10 PRESIDENT       5000
        20 ANALYST         3000
        20 CLERK            800
        20 MANAGER         2975
        30 CLERK            950
        30 MANAGER         2850
        30 SALESMAN        5600

[多一点点]

还有一件事:有一种方法可以在不使用GROUP BY子句的情况下聚合值;在Oracle中,这就是分析函数的功能。我不知道你使用的数据库系统中是否有类似的东西,但你可能会检查它。这是一个例子:

SQL> select deptno, ename, job, sum(sal) over (partition by deptno) sum_sal_dept
  2  from emp
  3  order by deptno, job;

    DEPTNO ENAME      JOB       SUM_SAL_DEPT
---------- ---------- --------- ------------
        10 MILLER     CLERK             8750
        10 CLARK      MANAGER           8750
        10 KING       PRESIDENT         8750
        20 FORD       ANALYST           6775
        20 SMITH      CLERK             6775
        20 JONES      MANAGER           6775
        30 JAMES      CLERK             9400
        30 BLAKE      MANAGER           9400
        30 TURNER     SALESMAN          9400
        30 WARD       SALESMAN          9400
        30 ALLEN      SALESMAN          9400
        30 MARTIN     SALESMAN          9400

看到?没有GROUP BY子句,我计算了每个部门的工资总和。

© www.soinside.com 2019 - 2024. All rights reserved.