2016-07-28 3 views
0

私は、特定の特性を持つすべての「ユーザー」を取り除く必要があるSQL文を生成しようとしています。ここに例がありますSQL select文を除く

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

SQLでは、私はそれらに関連した形質炎を持つすべてのユーザーを削除したいと思います。

だから基本的には、その後、我々は、私はSQLを通してそれを除外する代わりにするために、Excelで何かを使用することができたならば、これは同様に動作します

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

で残されると思います。私は様々な方法で探してきましたが、私が試したことから、ほとんどの人はその特性を持つ単一の行だけを削除しますが、それに伴ってユーザーは削除しません。

私は除いてSQLに見えたんだけど、私が使用しているテーブルはかなり複雑ですので、いくつかの助けが基本的な例を使用して

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

のラインで何かを翻訳するために、SQLを必要とします正しい方向に私を導くことがうれしいです。これを行う最も簡単な方法は、not existsを使用している

おかげ

+0

でユーザIDを破棄することができますか?または、それらを選択しないでください。 – MatBailie

+0

選択しない – khgove

+0

あなたは2つの回答の中から1つを選択しました.1つはNOT INを使用し、もう1つはNOT EXISTSです。 'user'(または' userid'ですか?)がNOT NULLの場合、それらは同等です。 nullの場合、NOT INは望ましい結果を生成しない可能性があります。 user = NULL、Trait = 'Fire'の行がある場合はNULL、Fireはサブクエリの結果セットになり、NOTは外部クエリのALL ROWSを拒否します。ほとんどの場合、存在しない方が安全です。 – mathguy

答えて

1

あなたは、サブ選択を使用して、テーブルから行を削除しますNOT IN

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

素晴らしい感謝!私は私の質問にそれをテストし、それは動作します。 – khgove

2

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