根据NOT EXIST查找与某些约束匹配的记录

时间:2014-05-12 12:56:09

标签: mysql

有一个查询可以选择一些数据。我正在创建一个抑制表,它会忽略包含某些数据的行。

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子句之后的语句没有产生结果,为什么会发生?

2 个答案:

答案 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

Fiddle

您的查询也有效..只需更改加入条件

即可
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)