需要SQL查询设计帮助

时间:2015-12-11 11:23:33

标签: sql

我试图用这个查询只选择多个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

查询中有什么问题?

由于

2 个答案:

答案 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标准不允许这样做,大多数数据库都不允许这样做。