具有和分组的高效SQL查询

时间:2014-06-11 18:19:54

标签: sql group-by having

我想知道在写这个SQL查询的效率方面是否有更好的解决方案,非常感谢您的帮助。

问题: 找出只生产相同型号型号的制造商,这些型号的数量超过1. Deduce:maker,type

我的答案是:

Select distinct P1.maker, P1.type 
from Product AS P1 join 
              (select maker 
               from Product 
               group by maker 
               having count(distinct type)=1 
               and count(model) > 1) as P2 
on P1.maker = P2.maker

给出结果,因为D只产生多于1个型号的打印机:

maker   type
  D    Printer

我尝试使用子查询部分:

select maker,type 
from Product 
group by maker 
having count(distinct type)=1 and count(model) > 1

给出错误:

  

列'Product.type'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

这让我感到困惑,因为它似乎在聚合函数计数中使用了类型。看来select中的有效列应该是group by或aggreagate函数。

Producer表格如下:

maker   type    model
B        PC     1121
A        PC     1232
A        PC     1233
E        PC     1260
A      Printer  1276
D      Printer  1288
A      Laptop   1298
C      Laptop   1321
A      Printer  1401
A      Printer  1408
D      Printer  1433
E      Printer  1434
B      Laptop   1750
A      Laptop   1752
E        PC     2112
E        PC     2113

1 个答案:

答案 0 :(得分:0)

尝试:

select maker, max(type)
from Product 
group by maker 
having count(distinct type)=1 
and count(model) > 1

在具有聚合函数的类型中没有做任何事情。当您收到该错误时,问题出在select中。您按制造商分组,如果制造商有多种类型,会发生什么?应该显示哪种类型? Sql不知道所以你必须聚合类型或者将它添加到组中。在您的情况下,由于整个点只返回具有单一不同类型的行,我们可以使用max来返回类型。