2012-10-15 49 views
1

我有兩個表ABA由字段A.id_b B.id稱爲B,使得存在於任何B.idid_b的PostgreSQL:WHERE IN和NOT其中

我有三個疑問:第一 一個:

SELECT COUNT(b.id) 
FROM B b 
WHERE b.id NOT IN (
    SELECT a.id_b 
    FROM A a) 

它給了我0;

第二個,差別只在NOT

SELECT COUNT(b.id) 
FROM B b 
WHERE b.id IN (
    SELECT a.id_b 
    FROM A a) 

這個查詢給我:

第三個:

SELECT COUNT(b.id) 
FROM B b 

這查詢給了我3599

SAME導致:

SELECT a.id_b 
FROM A a 

保證我兩套劈裂B.id,並且在這兩組元素的數量必須多元素總量算,但我有:1899年+ 0 = 3599

這怎麼可能?

+0

表'B'上的'ID'是唯一的嗎? – hims056

+0

是的,獨一無二的。首要的關鍵。和A.id_b id外鍵,帶有NOT NULL約束。 – devdRew

+0

備註:最後一個查詢不具有「COUNT」功能。是故意的嗎? – hims056

回答

1

找到了原因。 A中有記錄,A.id_b中有NULL個值。這就是爲什麼查詢:

SELECT COUNT(b.id) 
FROM B b 
WHERE b.id NOT IN (
    SELECT a.id_b 
    FROM A a) 

正在返回0

1

這個查詢告訴我們,表B具有共有3599行:

SELECT COUNT(b.id) 
FROM B b 

下一頁查詢告訴我們的B每一個ID是在一個使用:

SELECT COUNT(b.id) 
FROM B b 
WHERE b.id NOT IN (
    SELECT a.id_b 
    FROM A a) 

此外,該查詢告訴的是表B具有表A中提到的1899個id:

SELECT COUNT(b.id) 
FROM B b 
WHERE b.id IN (
    SELECT a.id_b 
    FROM A a) 

唯一可能的對此的解釋是一些B.id在表A中被用作A.id_b每行多於一次。 運行此查詢將顯示所有重複的名單表A中提到ID_B的:

SELECT a.id_b 
FROM A a 
GROUP BY a.id_b 
HAVING count(a.id_b) > 1 
+0

感謝您的回答。那麼,是的,來自B的行使用多於A的行。但是,對於'NOT IN'選擇的影響如何?我有'0'B行,它不在A和1899行中使用。其餘的在哪裏? – devdRew

+0

在此查詢 SELECT COUNT(b.id) FROM B B WHERE b.id IN(SELECT a.id_b 從一) IN(...)隱含跑獨特的選擇。它只發現了1899個唯一的 – mvp

+0

這就對了,我的問題是B的其餘元素在哪裏,爲什麼它們不出現在'NOT IN'查詢中。 – devdRew