2017-08-18 50 views
1

這樣這個SQL意味着什麼不存在?

int char int int 
id name a_id b_id 

SELECT count(*) FROM tbl t1 WHERE b_id = 12 AND NOT EXISTS(select * from tbl t2 where t2.a_id = t1.b_id AND t2.b_id = t1.a_id) 

我認爲它至少等於

SELECT count(*) FROM tbl t1 WHERE b_id = 12 AND NOT EXISTS(select * from tbl t2 where t2.a_id = 12 AND t2.b_id = t1.a_id) 

那麼這意味着什麼表?

例如,SELECT a_id FROM tbl t1 WHERE b_id = 12給1,2,3,4

然後執行以下操作:

select * from tbl t2 where t2.a_id = 12 AND t2.b_id = 1 # NULL 
select * from tbl t2 where t2.a_id = 12 AND t2.b_id = 2 # exists 
select * from tbl t2 where t2.a_id = 12 AND t2.b_id = 3 # exists 
select * from tbl t2 where t2.a_id = 12 AND t2.b_id = 4 # NULL 

所以COUNT(*)將是2?

+0

它與NULL的LEFT JOIN一樣,這是我們如何做到這一點 – Strawberry

+0

對不起,我是sql新手,你能用描述性的方式解釋嗎? – Sato

+0

那麼它選擇查詢的一部分中沒有出現在查詢的第二部分的東西 – Strawberry

回答

0

這一個是非常有趣的,因爲它找到了a_id和b_id中的數字12的「對稱性」,所以基本上它計算了表中的行數,其中b_id = 12,除了那些具有對稱對的行這樣的:

| a_id | b_id | 
--------------- 
| 12 | 12 | 
| 12 | 2 | 
| 2 | 12 | 

或者更一般地說,查詢跳過計數已A_ID = X B_ID = 12行和存在另一行,其中A_ID = 12,b_12 = X。

所以NOT EXISTS只是在那裏跳過計算具有對稱對的行,我不知道這對大多數應用程序有用,但它仍然很有趣。

+0

所以如果我從sql中刪除NOT,它會返回1,如果我有一個'a_id:12 b_id:2'記錄和'a_id:2,b_id:12'記錄? – Sato

+0

@Sato如果你刪除了NOT,那麼查詢將具有計算其中有12個的對稱對的數量的含義。所以是的,如果這些是表中唯一的兩行,它會返回1。 (抱歉刪除第一條評論,錯誤地) –