SQL查询从具有if条件的两个表中进行选择

时间:2011-12-20 01:05:52

标签: mysql sql select

我有两个表Notification和Acknowledgement。确认有一个字段,其中包含Notification表的主键。基本上,通知会有许多致谢。

Tables: Notification        Acknowledgment

fields: id, notifier        id, parent_id, status

现在我必须从通知中选择行:

  1. 没有确认WHERE Acknowledment.parent_id = Notification.id(基本上没有针对该特定通知的确认) //或
  2. 如果存在通知确认,则如果任何具有parent_id = Notification.id的确认具有Acknowledgment.status = someValue
  3. ,请选择通知

    伪SQL代码:

       "SELECT * FROM Notification (WHERE id is not present in Acknowledgment.parent_id) OR
       (WHERE id is present in Acknowledgment.parent_id AND Acknowledgment.status=@someValue"
    

    我可以将其分解为更简单的查询并实现这一目标,但我很想知道一个单一的查询来完成这项工作。

3 个答案:

答案 0 :(得分: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 :(得分:1)

SELECT n.* FROM Notification n
LEFT OUTER JOIN Acknowledgment a ON a.parent_id=n.id
WHERE a.status IS NULL OR a.status=@someValue

答案 2 :(得分: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中得到更好的优化(特别是在我的例子中,你在同一个表中使用多个),我只是提到这个替代方案,因为它是一个更直接的翻译你的伪查询。