2016-07-28 360 views
0

我試圖生成一個SQL語句,我需要擺脫所有具有歸因於它們的某些特徵的'用戶'。這裏是這裏的例子SQL select語句除外

+------+-------+ 
| User | Trait | 
+------+-------+ 
| A | Fire | 
| A | Water | 
| A | Air | 
| B | Water | 
| B | Air | 
| C | Water | 
| C | Fire | 
+------+-------+ 

使用SQL我想刪除所有與它們相關的特徵激發的用戶。

所以基本上,事後,我們就只剩下

+------+-------+ 
| User | Trait | 
+------+-------+ 
| B | Water | 
| B | Air | 
+------+-------+ 

如果我能夠在Excel中使用的東西篩選出來,而不是通過SQL,這將正常工作。我一直在尋找各種方法,但從我嘗試過的方式來看,大多數方法只會刪除具有該特徵的單行,而不是與用戶一起刪除。

我需要SQL中我看着SQL除外

For (i = table.length; i++) 
    If Trait = Fire 
     getVal(User(i)) 
    DeleteRows(User(i)) 

行翻譯的東西,但我使用的表是一個相當複雜一點,所以用一些幫助一個基本的例子很高興能帶領我走向正確的方向。

感謝

+0

丟棄用戶ID從表中刪除行?或者只是不選擇他們? – MatBailie

+0

不選擇他們 – khgove

+0

你有兩個答案之間的選擇,一個使用NOT IN和另一個NOT EXISTS。如果'user'(或者它是'userid'?)不是NULL,它們是等價的。如果它可能爲空,那麼NOT IN可能不會產生期望的結果。如果你有一行user = NULL和Trait ='Fire',那麼NULL,'Fire'將出現在子查詢的結果集中,而NOT IN將導致拒絕外部查詢中的ALL ROWS。在大多數情況下,NOT EXISTS更安全。 – mathguy

回答

1

您可以使用子選擇與NOT IN

SELECT * 
FROM mytable 
WHERE userid NOT IN (SELECT userid FROM mytable WHERE Trait = 'Fire') 
+0

非常感謝!我在我的查詢中進行了測試,它可以工作。 – khgove

2

這樣做的最簡單的方法是使用not exists

select * 
from tablename t 
where not exists (select 1 from tablename where userid = t.userid and Trait = 'Fire') 
0

嘗試:

select a.user, a.trait 
    from the_table a 
where not exists 
(select null 
    from the_table b 
    where b.user = a.user 
    and b.trait = 'Fire' 
);