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来解决它。但现在想要这样做。
答案 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并选择具有最大标识列的行。