2014-05-12 43 views
0

有一個查詢選擇一些數據。我創建了一個忽略包含特定數據的行的抑制表。根據不同的存在名稱查找符合某些限制的記錄

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

想我誤解你想要什麼。你可以給一些示例數據(或更好的,一個小小的sql小提琴),並顯示你想要檢索? –

回答

1

你被錯誤的條件加入。 加盟條件變化從s.id = r.ids.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) 
+0

我的不好!爲了提高可讀性,我改變了模型,但忘了在下面的查詢中做出相關更改。 – Pranav

+0

現在問題解決了嗎? –

+0

當(18,7)添加到抑制時,內部聯接方法失敗。NOT EXIST工作正常。 – Pranav

1

我相信你要完成可以用一個簡單的左更容易做的事情JOIN和你的where子句中的IS NULL:

​​
+0

它正在工作。謝謝Marsh! – Pranav

相關問題