2012-03-02 39 views
2

以下查詢是正確的。它返回行paulrick,因爲它們對子行的評分最高。以下鏈接解決了這個問題。我無法理解查詢。我理解加入,我不明白的是t2.rating is nullWHERE子句爲空?不明白

http://sqlfiddle.com/#!2/97e60/2

select t1.* from mytable t1 
    left join mytable t2 
    on t1.parentid = t2.parentid and t1.rating < t2.rating 
    join mytable parents 
    on parents.id = t1.parentid 
    where t2.rating is null AND parents.name like '%mike%' 

t1.rating < t2.rating獲得最高額定值爲子行,我知道t2.rating is null意味着t2.rating是假的,但我不知道它是什麼在查詢幹什麼?我刪除了它,並添加了其他結果。那麼它究竟做了什麼來消除不正確的結果呢?

回答

0

您不能將null與除「is null」或「is not null」以外的其他值進行比較。我認爲this link最好地描述了它。

1

因爲你已經有了一個left join(而不是join),你會從t1得到行,即使沒有任何匹配行從t2。指定t2.rating is null只是表示您將只獲得t2的行,其中評級爲空。

null的任何比較都是錯誤的,即使雙方都是null。 Where子句中的t2.rating is null和連接子句中的t1.rating < t2.rating的組合意味着您將從從不獲得t2的任何行,因爲這些條件永遠都不會是true

+0

Thanks謝謝你的幫助...所以t2.rating爲null消除了t2和t1.rating中的行 user892134 2012-03-02 21:44:58

+0

這似乎與OP的說法不一致:_「下面的查詢是正確的,它返回行'paul'和'rick' ...」_。 – 2012-03-02 21:45:33

+1

這個答案是錯誤的。 WHERE子句在應用LEFT JOIN之後應用。我認爲在原始表中有0行,評級= NULL。 WHERE子句只保留ON子句永遠不能匹配的左側的行 – 2012-03-02 22:35:17

1

這裏有一個解釋:

1,當你做了左/ JOIN,在左表(T1)的每一行,你會得到至少一個結果。

2 /如果通過ON子句,t1行不能匹配任何t2行,則會得到一個NULL t2行(與t2列相同,但填充了NULL值)。

3 /所以,WHERE t2.rating IS NULL實際上過濾表t1,並且只保留的量,ON子句永遠不能被匹配的那些行

4 /讀ON子句,這些過濾行是沒有其他行具有較高評級的那些行:如果t1行不是最高評級,則在t2中會有一條具有較高評級的行;這一行將匹配ON子句,並且t2.rating不會是NULL!

5 /所以過濾線正確地將匹配你在找什麼:最高等級行

我希望這將澄清你的東西!