我有两个表Notification和Acknowledgement。确认有一个字段,其中包含Notification表的主键。基本上,通知会有许多致谢。
Tables: Notification Acknowledgment
fields: id, notifier id, parent_id, status
现在我必须从通知中选择行:
伪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"
我可以将其分解为更简单的查询并实现这一目标,但我很想知道一个单一的查询来完成这项工作。
答案 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中得到更好的优化(特别是在我的例子中,你在同一个表中使用多个),我只是提到这个替代方案,因为它是一个更直接的翻译你的伪查询。