2011-09-06 59 views
0

這是加入有效MySQL中:以下加入語句有效嗎?

FROM a 
JOIN b on a.c = b.c and b.c = 1 

那麼它不會像這樣工作,但是當我使用右連接的b.c = 1被忽略。 這是爲什麼?

+0

爲什麼不嘗試一下,看看會發生什麼? – Mac

回答

2

它不是在RIGHT JOIN忽略。

(概念)的加入恰好與應用然後從b任何非匹配的行會添加回到了過濾器。

所以查詢

SELECT a.c, b.c 
FROM (select 1 AS c 
     UNION ALL 
     SELECT 2) a 
     RIGHT JOIN (select 1 AS c 
        UNION ALL 
        select 2 AS c) b 
     on a.c = b.c 
      and b.c = 1 

返回

c   c 
----------- ----------- 
1   1 
NULL  2 

你可以儘管兩個表都有2,但join子句中的附加過濾器意味着這些行不要加入。然而,由於它是right outer加入2行的右手錶(b)仍然出現在結果中。

編輯:RE:問題的意見

那怎麼辦我LEFT JOIN沒有添加過濾行了?如果 我使用WHERE子句,而不是聯接會更慢,因爲更多 行將不得不加入,對吧?

我真的不明白這個問題。

根據是否要保留左輸入或右輸入中的所有行,您會選擇LEFT vs RIGHT連接。對於簡單的2表查詢,你當然可以使用任何一種方法,只是顛倒表的順序。

類似的問題是否將過濾器置於WHERE子句或JOIN條件中。在一個OUTER JOIN這可以改變的結果(在我的示例數據移動b.c = 1WHERE子句意味着只有1行會被不2返回),其中過濾器被放置,但我

對於不要緊的INNER JOIN的情況下找到更合理的過濾器,關注JOIN中的2個表格和WHERE

+0

那麼我如何'LEFT JOIN'而不添加過濾行?如果我使用'WHERE'子句,則連接會變慢,因爲需要連接更多的行,對嗎? – hidarikani

+0

請參閱編輯我的答案。 –

+0

對不起,我的意思是'RIGHT JOIN'在評論中,但我想我現在明白了。 – hidarikani

1

是的。這是確定有on子句中有無關其他表

+0

如果連接是右連接會怎麼樣?當我使用RIGHT JOIN時,** b.c = 1 **部分被忽略 – hidarikani

0

額外的條件,爲什麼不把它寫這樣使它更清晰:

FROM a 
JOIN b on a.c = b.c 
WHERE b.c = 1 
+0

您應該將所有條件放在連接子句的表「b」上 –

+0

remi - 爲什麼?是否應該在ON或WHERE子句中放置一個條件取決於它是否與連接操作的邏輯或整個查詢的邏輯有關。 – Hammerite

+0

@Hammerite - 我以爲remi正在考慮'RIGHT JOIN'的情況,但它看起來好像是一個附加問題,原本並不存在。 –

1

中的所有其他表格之間的關係是否有效。

但是,當您使用正確的連接時,除了那些人之外,您將有效地獲得「正確」表中不滿足連接條件的所有值。這就是正確的加入

在這種情況下,使用where子句來限制從表b中提取的內容。

從 RIGHT JOIN B在交流轉換器= b.c WHERE b.c = 1