有一个查询可以选择一些数据。我正在创建一个抑制表,它会忽略包含某些数据的行。
suppression: occasion_id | days_before
reminder: id | days_before | occasion_id
我正在使用NOT EXIST来忽略某些提醒的选择。
查询
SELECT id
from Reminder AS r
WHERE NOT EXIST (SELECT 1
FROM Suppression s
WHERE s.occasion_id = r.occasion_id
AND s.days_before = r.days_before)
Reminder:1) 101| 1 |18
2) 102| 7| 18
Suppresion: 18 | 1
应忽略第一个提醒,并应包含第二个提醒。
例如,如果抑制表包含occasion_id - 18和days_before- 1,则select应忽略包含这些数据的提醒。
子查询返回' 1'在第二次提醒的情况下也是如此。即使WHERE子句之后的语句没有产生结果,为什么会发生?
答案 0 :(得分:1)
我相信你想要完成的事情可以通过简单的LEFT JOIN和你的where子句中的IS NULL更轻松地完成:
SELECT r.id
FROM Reminder AS r
LEFT JOIN Supression s ON s.id = r.id AND s.days_before = r.days_before
WHERE s.id IS NULL
答案 1 :(得分:1)
你是在错误的条件下加入的。
将加入条件从s.id = r.id
更改为s.occasion_id = r.occasion_id
SELECT r.*
FROM Reminder AS r
inner JOIN Supression s ON s.occasion_id = r.occasion_id
AND s.days_before <> r.days_before
您的查询也有效..只需更改加入条件
即可SELECT id
from Reminder AS r
WHERE NOT EXISTs (SELECT 1
FROM Supression s
WHERE s.occasion_id = r.occasion_id
AND s.days_before = r.days_before)