分组在哪里不工作

时间:2011-08-21 07:47:15

标签: sql database plsql db2

SELECT A.ID, A.COLUMN_B, A.COLUMN_C FROM A
WHERE A.COLUMN_A IN
 (
  SELECT A.COLUMN_A
  FROM B
  INNER JOIN A ON B."COLUMN_A" = A."COLUMN_A"
  WHERE B."COLUMN_B" = 'something'

  UNION

  SELECT A."COLUMN_A"
  FROM A  
  WHERE A."COLUMN_D" IN (X,Y,Z) OR A."COLUMN_D" = 'something'
  )

现在我要添加group by (A.ID)order by (A.COLUMN_B) DESC,然后添加select first。但DB不会允许。有什么建议 ?一旦返回内部Union部分,我可以使用LINQ来解决它。但现在想要这样做。

3 个答案:

答案 0 :(得分:1)

这里有几件事 首先,在DB2中,当使用GROUP BY时,您只能选择分组语句中列出的那些列 - 其他所有必须都是聚合函数的一部分。因此,按a.Id分组并按a.Column_B排序不会有效 - 您需要按SUM(a.Column_B)或适用的方式订购。
其次......你的查询可以在一般意义上使用一些工作 - 具体来说,你是两次自我加入,你根本不需要这样做。试试这个:

SELECT a.Id, SUM(a.Column_B) as total, SUM(a.Column_C)
FROM a
WHERE a.Column_D in (X, Y, Z, 'Something')
OR EXISTS (SELECT '1'
           FROM b
           WHERE b.Column_A = a.Column_A
           AND b.Column_B = 'Something')
GROUP BY a.Id
ORDER BY total DESC
FETCH FIRST 1 ROW ONLY

交换SUM函数以获取适当的值。

答案 1 :(得分:0)

您不能在ORDER BY或SELECT中使用未包含在GROUP BY中的列,除非它正在聚合(在MAX()或COUNT()或SUM()之类的函数中。

因此,你可以GROUP BY A.ID,A.COLUMN_B,然后是ORDER BY COLUMN_B。使用TOP 1也应该有效。

我刚注意到你在使用DB2。我知道它将在SQLServer上以这种方式工作。 DB2应该是类似的。

答案 2 :(得分:-1)

采用了oterh方式。刚刚在A.ID上使用Order By并选择具有最大标识列的行。