2016-08-04 78 views
0

我使用的是Oracle,我有一個查詢:有2子查詢的問題SELECT

SELECT count(*) FROM table1; 

會拋出我作爲結果21932,那麼我以前設置查詢作爲子查詢中的下一個方法:

SELECT count(*) FROM table2 WHERE attr1 IN (SELECT attr1 FROM table1); 

這會引起我的結果10489。所以,我想刪除不在此組內的行,其餘運行DELETE句話之前,我想檢查行的這個數字是正確的,下一個查詢:

SELECT count(*) FROM table1 WHERE attr1 NOT IN 
    (SELECT attr1 FROM table2 WHERE attr1 IN (SELECT attr1 FROM table1)); 

行的數目應該是11443 (total - 10489) ,但聲明拋出我3743行,爲什麼這是結果?我怎麼能得到我想要刪除的行數?

在此先感謝。

回答

2

您正在計算記錄的table2attr1其中存在table1。這並沒有告訴我們table2中沒有這種匹配的記錄。可能是1分的記錄,可能是一百萬條記錄都具有不同的attr1,可能是一百萬條記錄都具有相同的attr1等,所以不存在數學告訴我們您的最後一個查詢應導致的。

.. 。或者你還沒有告訴我們這兩張表和attr1

+0

您說得對,'attr1'在這兩個表 –

+0

Hm中都是唯一的,而且mathguy關於NULL的猜測也不適用? 'count(*)','count(attr1)'和'count(distinct attr1)'給每個表相同的數字? –

+0

對不起''attr1'在兩個表中都不是唯一的,只在'table2'中,而不在'table1'中,我可以注意到運行這個語句'count(distinct attr1)'。 –

1

您在where子句中選擇的嵌套可能是問題。爲了使它更簡單,我會說:

select count(*) from table1 t 
where not exists (select 1 from table2 t2 
        where t2.attr1 = t.attr1) 
+0

您的陳述拋出我結果'3743' –

1

的差異可能會告訴你一些在table1.attr1NULL,因爲NULL既不是IN (...)也不NOT IN (...)

嘗試:select case when attr1 is null then 1 end as count_nulls from table1 - 這會直接告訴你在table1.attr1有多少個空值。