2011-12-20 107 views
1

我有兩個表通知和確認。確認有一個包含通知表主鍵的字段。基本上通知會有許多確認。SQL查詢從兩個表中選擇條件如果條件

Tables: Notification  Acknowledgment 

fields: id, notifier  id, parent_id, status 

現在我不得不選擇從通知,使得行:

  1. 沒有確認WHERE Acknowledment.parent_id = Notification.id(基本上沒有確認該特定通知) //或
  2. 如果存在確認通知,則選擇通知,如果任何具有parent_id = Notification.id的確認具有確認。狀態= 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
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.id IS NULL而不是a.status。因爲無論如何都不會成爲這樣的一排呢,可以選擇去嗎? – nawfal 2011-12-20 01:18:05

+0

@nawfal你是對的 - 絕對沒有區別。 – dasblinkenlight 2011-12-20 01:19:08

+0

感謝您指出。我已經更新了我的答案。 – Akhil 2011-12-20 01:20:27

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小號往往在SQL(特別是,在我的例子,您使用的是相同的表不止一個)可以更好地優化,我只提這種替代因爲它是您的僞查詢的更直接的翻譯。

+0

謝謝..這是不同的,更簡單,但更詳細。謝謝你讓我知道這些關鍵詞。它更容易記住 – nawfal 2011-12-20 01:17:02

+0

是的,我明白了.. – nawfal 2011-12-20 01:20:06