只在sql中使用select而不是group by

时间:2012-01-06 14:42:59

标签: sql

我有这张桌子:

supplier  | product  | qty
--------------------------
  s1      |    p1    | 300
  s1      |    p2    | 90
  s2      |    p3    | 89

我想找到超过2种产品的供应商。 但只有select和where,没有group by。有什么建议吗?

5 个答案:

答案 0 :(得分:3)

为什么你不想使用group by超出我,但这可能有用:

SELECT Supplier FROM table outer WHERE 
  (
   select count(Products) from table inner 
   where inner.Supplier = outer.Supplier
  ) > 2  

请记住,该组是为这样的东西制作的,应该使用。

答案 1 :(得分:2)

在通常的parts and suppliers database中,此relvar名为SP

SELECT DISTINCT T1.SNO 
  FROM SP AS T1 
          JOIN SP AS T2 
             ON T1.SNO = T2.SNO
                AND T2.PNO <> T1.PNO
          JOIN SP AS T3
             ON T1.SNO = T3.SNO
                AND T3.PNO <> T1.PNO
                AND T3.PNO <> T2.PNO;

注意到您可以使用HAVING而不使用GROUP BY

SELECT DISTINCT T1.SNO 
  FROM SP AS T1
 WHERE EXISTS (
               SELECT 1
                 FROM SP AS T2
                WHERE T2.SNO = T1.SNO
               HAVING COUNT(*) > 2
              );

答案 2 :(得分:2)

;WITH
  sequenced_data AS
(
  SELECT
    supplier,
    ROW_NUMBER() OVER (PARTITION BY supplier ORDER BY product) AS supplier_product_ordinal
  FROM
    YourTable
)
SELECT
  supplier
FROM
  sequenced_data
WHERE
  supplier_product_ordinal = 3

但我希望它比使用GROUP BY慢。


SELECT DISTINCT
  supplier
FROM
  yourTable
WHERE
      EXISTS (SELECT * FROM yourTable AS lookup WHERE supplier = yourTable.supplier AND product < yourTable.product)
  AND EXISTS (SELECT * FROM yourTable AS lookup WHERE supplier = yourTable.supplier AND product > yourTable.product);

答案 3 :(得分:1)

;WITH T AS
(
SELECT *,
       COUNT(*) OVER (PARTITION BY S) AS Cnt
FROM YourTable
)
SELECT DISTINCT S
FROM T
WHERE Cnt > 2

答案 4 :(得分:0)

带子查询的

select distinct supplier
from table a
where (select count(*) 
       from table b 
       where b.supplier = a.supplier and b.product <> a.product
       ) > 1