2012-07-27 141 views
3

我在理解LIKE和NOT LIKE運算符時遇到了問題。這是我執行的一個查詢:SQL不喜歡和喜歡

select serial_number from UNIT U 
group by serial_number 
order by serial_number 

它可以產生2000個結果。

當我執行此查詢,我得到1950結果:

select serial_number from UNIT U 
WHERE op_name LIKE 'Assembly' 
group by serial_number 
order by serial_number 

所以,當我執行這個查詢,我希望得到50個結果,而是我可以獲得2000:

select serial_number from UNIT U 
WHERE op_name NOT LIKE 'Assembly' 
group by serial_number 
order by serial_number 

任何解釋嗎?謝謝一堆。

回答

3

你正在做的這個組使得它不能真正有效地進行你正在嘗試的那種計數比較。 假設您有10個唯一的序列號,並且對於每個序列號,有兩行(共20行),一個帶op_name「Xyz」,另一個帶op_name「Assembly」。您的第一個查詢將返回10行。您的第二個查詢將返回10行。您的第三個查詢將返回10行。由於該組,LIKE「Assembly」和NOT LIKE「Assembly」並不相互排斥。

+0

謝謝,我意識到矛盾消失了,當我拿走小組的時候。我不太清楚如何解決這個問題,因爲我需要羣組獲得唯一的序列號,但這是一個開始。 – user1558927 2012-07-28 00:22:08

0

沒有通配符%您的LIKE就像=一樣運作。

檢查,看看是什麼值?最有可能的,如果你使用的是LIKE,你也想使用通配符,例如:

選擇SERIAL_NUMBER從單元U WHERE op_name NOT LIKE「%組裝% '基團通過SERIAL_NUMBER爲了通過SERIAL_NUMBER

2

NULL既不LIKE也不NOT LIKE任何東西。


其實,仔細閱讀你的號碼,可能還有其他原因。 (我更早一點是事實,但這種可能性更大)。

假設你有以下數據:

serial_number | op_name 
--------------+--------- 
1    | Assembly 
1    | Not 

1將通過這兩個查詢返回。

+0

對呀! :-) – richard 2012-07-28 00:09:42

+0

嗯,我不認爲該op_name被稱爲不。只是爲了進一步的信息,如果我做op_name ='Assembly'和op_name!='Assembly'而不是LIKE和NOT LIKE – user1558927 2012-07-28 00:12:48

+0

@ user1558927,op_name ='Assembly'和op_name如'Assembly'是完全相同的同樣的!=和不喜歡),所以你應該期待同樣的事情發生。 – hatchet 2012-07-28 00:20:32