2011-12-20 24 views
1

私は2つのテーブルの通知と肯定応答を持っています。肯定応答には、通知テーブルの主キーを保持するフィールドがあります。基本的に、通知には多くの謝辞があります。条件付きで2つのテーブルから選択するSQLクエリ

  1. は、肯定応答がないAcknowledment.parent_id = Notification.id(その特定の通知のための基本的確認応答) //または
  2. Tables: Notification  Acknowledgment 
    
    fields: id, notifier  id, parent_id, status 
    

    は今、私は通知するようにから行を選択する必要があります

  3. 通知の確認がある場合は、parent_id = Notification.idの肯定応答のいずれかがAcknowledgment.status = someValueを持つ場合、通知を選択します。

擬似SQLコード:

"SELECT * FROM Notification (WHERE id is not present in Acknowledgment.parent_id) OR 
    (WHERE id is present in Acknowledgment.parent_id AND [email protected]" 

私は単純なクエリにそれを破ると、これを達成するため、私はこれを成し遂げるために1つのクエリを知るのが大好きだことができます。..

答えて

1
SELECT * 
    FROM Notification n 
      LEFT OUTER JOIN Acknowledgment a ON a.parent_id = n.id 
    WHERE  (a.parent_id IS NULL OR a.status = @somevalue) 
1
SELECT n.* FROM Notification n 
LEFT OUTER JOIN Acknowledgment a ON a.parent_id=n.id 
WHERE a.status IS NULL OR [email protected] 
+0

@Akhilの答えにはコード中のa.statusではなくa.id IS NULLがあります。とにかくそのような行がないので、いずれかのために行くのは大丈夫ですか? – nawfal

+0

@nawfalあなたは正しい - 違いは全くありません。 – dasblinkenlight

+0

それを指摘してくれてありがとう。私は私の答えを更新しました。 – Akhil

1

LEFT OUTER JOINSの代わりにthe EXISTS clauseを使用できます。ご例えば

SELECT * 
FROM Notification n 
WHERE NOT EXISTS (
    SELECT * 
    FROM Acknowledgement 
    WHERE parent_id = n.id 
) OR EXISTS (
    SELECT * 
    FROM Acknowledgement 
    WHERE parent_id = n.id AND status = @someValue 
) 

JOIN sが(特に場合は、私の例のように、あなたが同じテーブルに複数を使用している)より良いSQLで最適化される傾向にある、私はこの選択肢に言及しますこれは疑似クエリのより直接的な変換であるためです。

+0

ありがとう..これは違った単純ですが、より冗長です。このようなキーワードを私に教えてくれてありがとう。それは覚えやすいです – nawfal

+0

はい私はそれを得る.. – nawfal

関連する問題