2015-02-09 13 views
2

爲簡單起見,假設我有一個表transactionsid作爲主鍵。目前只有10與ID表中的行1至10從預定義列表中選擇NOT INK

我已經ID的列表:{9,10,,}。該列表不存儲在數據庫中。

我想查詢不在transactions表中的ID的數據庫。在上面的情況下,我想得到11,12。

什麼是最好的方式來寫這個查詢?

目前我只是查詢SELECT * FROM transactions WHERE id IN (9,10,11,12)。並在代碼中做我的交集。我想知道我是否可以在SQL中一步完成所有工作。

+1

創建一個包含要匹配的id值的表格。使用該表作爲左連接的外部表。戈登的答案和我的一樣。 – shawnt00 2015-02-09 15:16:41

+1

爲什麼不'SELECT * FROM transactions where id not in(9,10,11,12)'? – MrTux 2015-02-09 15:17:17

+2

因爲您要選擇的數據不是表中可用的數據。因爲它不存在,你永遠不會得到11或12。 – shawnt00 2015-02-09 15:18:11

回答

2

你可以用包含id的子查詢來做到這一點。這裏有一種方法:

select ids.id 
from (select 9 as id union all select 10 union all select 11 union all select 12 
    ) ids 
where not exists (select 1 from transactions t where t.id = ids.id); 

從一個叫transactions表返回行似乎效率不高 - 太多的數據來回回您所需要的。 (雖然你只有10行,所以這對你的數據大小沒有什麼大不了的。)

+0

謝謝。我認爲這會很好地工作。 – Yada 2015-02-09 15:20:21

+0

這些查詢顯示在我的慢速查詢日誌中。也許我應該使用內存表。 – Yada 2015-02-26 18:46:26

0

另一種方法是使用EXCEPT子句。例如;

select 9 as id union all select 10 union all select 11 union all select 12 
except select id from transactions