我试图用这个查询只选择多个agregated表的一个记录:
select * from table1 C left join
table2 E on C.id=E.id left join
table3 D on E.id=D.id
where C.id=id and (E.id IS NULL or D.id IS NOT NULL)
GROUP BY C.field
执行此查询时,将启动SQLException:
the expression is not in an agreement or columns of the GROUP BY
查询中有什么问题?
由于
答案 0 :(得分:1)
我试图只选择多个agregated的记录之一 带有此查询的表:
select * from...
其实你不是。根据SQL标准,asterisk表示所有列,并且与GROUP BY
语句不兼容。
在此查询中:
select * from ... GROUP BY C.field
你实际上说的是“从这些表格中提供所有内容,但只在一列中提供GROUP BY
。
SQL引擎不像人类那样智能,无法识别您要对其他列做什么,因此它会看到您要求撤回的另外5或10列,并且无法将它们与您的{{1}进行协调在一列上请求。
对于解决方案,请尝试(1)将GROUP BY
替换为SELECT *
或(2)明确列出SELECT c.Field
语句中的所有列,然后在SELECT
中列出它们声明。
答案 1 :(得分:0)
如果您希望每个“组”有一行,请使用row_number()
或类似功能:
select t.*
from (select *, row_number() over (partition by c.field order by c.field) as seqnum
from table1 C left join
table2 E
on C.id = E.id left join
table3 D
on E.id = D.id
where C.id = id and (E.id IS NULL or D.id IS NOT NULL)
) t
where seqnum = 1;
您的原始查询不起作用,因为SELECT
中的列不在GROUP BY
中。 ANSI标准不允许这样做,大多数数据库都不允许这样做。