2011-12-20 108 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