2010-02-04 49 views
2

我正在維護一個查詢如下:。任何人都可以解釋爲什麼地球上這些查詢是不一樣的?

select field_1, field_2 
from source_table 
minus 
select field_1, field_2 
from source_table 
where status_code in (3, 600); 

當我看到這個查詢,我馬上想到,「這是瘸子爲什麼不直接使用‘NOT IN’和刪除減號業務。所以我重新寫爲這樣:

select field_1, field_2 
from source_table 
where status_code not in (3, 600); 

只是爲了仔細檢查我的理智,我得到了每個查詢的計數令我驚訝,第一個查詢返回789089條記錄,而第二查詢返回的1518450條記錄!

我看了這個從服務器角度,但無法弄清楚這兩個查詢是如何不同的。任何人都可以解釋發生了什麼,或者爲什麼我今天早上是白癡?

+0

你張貼兩個查詢計劃。 – EvilTeach 2010-02-04 15:19:22

回答

9

這些查詢確實是不同的。 field_1field2不等於status_code 3和600. field_1可能是'A',而field_2可能是'B',所以您會從第一個SELECT中刪除記錄,看起來像A, B。原件可能是實現正確結果的最佳方式。

編輯:給你這是怎麼回事更好的主意,你可以得到相同的結果,以類似的方式向你怎麼想編寫查詢,通過做一個子查詢:

select distinct field_1, field_2 
from source_table 
where (field_1, field_2) not in (
    select field_1, field_2 
    from source_table 
    where status_code in (3, 600) 
); 
+0

啊,剛剛有一個燈泡的時刻。謝謝您的幫助! – 2010-02-04 15:36:47

+0

這仍然是不一樣的。 MINUS是一個集合命令,並且會隱含地做一個獨特的。您需要將其添加到替換中。 – 2010-02-04 21:37:33

+0

@加里謝謝。我已經相應地更改了SQL。 – 2010-02-04 21:45:09

3

如果你對field_1,field_2或兩者都沒有唯一的限制,Alison可能是對的。考慮你有一張表: A B 3 A B 10

第一個查詢將消除兩個行,第二個只有一個。 另外,如果你在STATUS_CODE列有NULL值,你可能會得到不同的結果,(A或沒有A)在SQL如果你有在列NULL值不起作用。

4

如果沒有對field_1和field_2的組合,唯一約束,第二查詢可能包含重複,而第一不會像「減」將打壓他們。嘗試使用「distinct」查看第二個查詢,並查看計數是否匹配。

4

的UNION,MINUS和INTERSECT操作符返回唯一的值。如果你有兩行具有相同field_1和field_2,第一個查詢將計算一次,而第二個將兩次算什麼:

SQL> insert into source_table values ('a', 'b', 10); 

SQL> insert into source_table values ('a', 'b', 10); 

SQL> select field_1, field_2 
    2 from source_table 
    3 minus 
    4 select field_1, field_2 
    5 from source_table 
    6 where status_code in (3, 600); 

FIELD_1 FIELD_2 
---------- ---------- 
a   b 

SQL> select field_1, field_2 
    2 from source_table 
    3 where status_code not in (3, 600); 

FIELD_1 FIELD_2 
---------- ---------- 
a   b 
a   b 
+0

啊,這個細節有很大的不同。我忘記了這一點。謝謝! – 2010-02-04 15:37:18

+0

儘管如果這是完整的故事,人們可以簡單地插入DISTINCT並完成它。但是,正如上面的一些帖子所顯示的那樣,這不是完整的故事(但當然是有效的)。 – 2011-05-19 14:25:25

相關問題