2012-01-21 2 views
0

私は、ユーザー(UserID、Name)、イベント(EventID、EventName)を保持するテーブル、ロール(RoleID、RoleName)を保持するテーブル、および各イベントのユーザーにロールを割り当てるテーブルイベントID、ユーザーID、役割ID)。数字が列内にない場所を照会しますか?

ここでは、特定の役割を含まないすべてのイベントのリストを取得したいと思います。たとえば、roleIDのないすべてのイベントを言いますが、別のroleIDを持つ行は必要ありません。 どうすればいいですか?

+0

明確にしてください:「しかし、私はしたくありません別のロールIDを持つ行 " – IsisCode

+0

ここで問題は見えません! –

+0

すべての行にroleID 2またはroleID 3を追加する必要はありません。どのイベントにroleID 1が含まれていないかを知りたいのです。 – user1162628

答えて

4

このような何か

SELECT * 
FROM events 
WHERE eventid NOT IN 
    (SELECT eventid FROM assign WHERE roleID=1) 

またはサブクエリが利用できない場合

SELECT e.* 
FROM events e 
    LEFT JOIN assign a ON (e.eventid=a.eventid AND a.roleid=1) 
WHERE a.roleid IS NULL 

つ以上を実行する必要があり同等のクエリ:

SELECT * 
FROM events e 
WHERE NOT EXISTS 
    (SELECT * FROM assign a WHERE a.eventid=e.eventid AND roleID=1) 
+0

これは完全に機能します。ありがとうございました。 – user1162628

+0

@ypercube:他の2つの – stryba

+0

DBMSオプティマイザとの相関サブクエリ(3つのクエリ)のパフォーマンスが等価であり、同一のプランを生成することができます。おそらくクエリ2では、テストなしでアイデアはありません。 –

関連する問題