2012-01-06 34 views
-1

我有這個表:只使用SQL,而不是選擇組由

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

我想找到供應商超過2種產品。 但只有選擇和在哪裏,沒有group by。任何建議?

+1

爲什麼你不希望通過使用組? – 2012-01-06 14:47:25

+1

你的問題就像說「我想選擇某個記錄而不使用WHERE」。 GROUP BY存在是有原因的。此外,在這種情況下,它完全適用於您的需求。如果你想避免它,因爲你不明白它,我建議你閱讀它(W3學校有一個很好的網頁),並學習如何正確編碼。因爲你不明白一個概念,所以一旦你的代碼變得更加複雜,往往會在以後導致你成爲大問題。 – 2012-01-06 14:48:54

+0

您使用的是什麼RDBMS? – Lamak 2012-01-06 14:50:29

回答

3

爲什麼你想不使用組超越我,但是這可能工作:

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

請記住,該組由爲東西做出這樣的,應該被使用。

+0

這使用一個*隱含* GROUP BY。你可能沒有輸入字母,但通過使用* COUNT(*)等*聚合函數,你會得到一個。 – MatBailie 2012-01-06 15:15:43

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

+1 - 堅持使用聚合請求的信件。做得很好! – JNK 2012-01-06 14:51:37

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 
      ); 
0

與子查詢:

select distinct supplier 
from table a 
where (select count(*) 
     from table b 
     where b.supplier = a.supplier and b.product <> a.product 
     ) > 1 
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); 
+0

+1我喜歡子查詢的'>'和'<'邏輯,整潔:) – onedaywhen 2012-01-06 15:41:11

+0

哈哈,第二個查詢很有趣,像我一樣,但更聰明一步。無論如何,+1 – 2012-01-06 15:45:03

相關問題