2009-07-09 41 views
1

我有我的數據庫中的表:在SQL中選擇值沒有除其他相應的值,我搜索

Name | Element 
1   2 
1   3 
4   2 
4   3 
4   5 

我需要做一個查詢的數量的參數將選擇名稱的值在右側,只有這些值。 例如: 參數是2和3,查詢應該只返回1而不是4(因爲4也有5)。對於參數2,3,5它應該返回4.

我的查詢看起來是這樣的:

SELECT name FROM aggregations WHERE (element=2 and name in (select name from aggregations where element=3)) 

我有什麼要添加到該查詢,使之不回4?

回答

8

一個簡單的方法來做到這一點:

SELECT name 
FROM aggregations 
WHERE element IN (2,3) 
GROUP BY name 
HAVING COUNT(element) = 2 

如果你想添加更多,你需要同時改變IN (2,3)部分和HAVING部分:

SELECT name 
FROM aggregations 
WHERE element IN (2,3,5) 
GROUP BY name 
HAVING COUNT(element) = 3 

更健壯方式是檢查一切不是在你的設置:

SELECT name 
FROM aggregations 
WHERE NOT EXISTS (
    SELECT DISTINCT a.element 
    FROM aggregations a 
    WHERE a.element NOT IN (2,3,5) 
    AND a.name = aggregations.name 
) 
GROUP BY name 
HAVING COUNT(element) = 3 

它不是雖然效率很高。

+0

如果元素是'2'和'4',它仍然會匹配where和有標準,不... ...? – 2009-07-09 14:22:35

0

這沒有經過測試,但通常我會在我的where子句中查詢少量數據。請注意,這對大量記錄無效。

SELECT ag1.Name FROM aggregations ag1 
WHERE ag1.Element IN (2,3) 
AND 0 = (select COUNT(ag2.Name) 
    FROM aggregatsions ag2 
    WHERE ag1.Name = ag2.Name 
     AND ag2.Element NOT IN (2,3) 
) 
GROUP BY ag1.name; 

這是說「給我所有我想要的元素,但與元素沒有記錄的名字,我不想」

1

創建一個臨時表,與你的價值觀填補它與這樣的查詢:

SELECT name 
FROM (
     SELECT DISTINCT name 
     FROM aggregations 
     ) n 
WHERE NOT EXISTS 
     (
     SELECT 1 
     FROM (
       SELECT element 
       FROM aggregations aii 
       WHERE aii.name = n.name 
       ) ai 
     FULL OUTER JOIN 
       temptable tt 
     ON  tt.element = ai.element 
     WHERE ai.element IS NULL OR tt.element IS NULL 
     ) 

這比使用COUNT(*)更有效,因爲它會停止,一旦檢查name,因爲它發現沒有一個匹配(在aggregationstemptable)第1行

相關問題