這是加入有效MySQL中:以下加入語句有效嗎?
FROM a
JOIN b on a.c = b.c and b.c = 1
那麼它不會像這樣工作,但是當我使用右連接的b.c = 1被忽略。 這是爲什麼?
這是加入有效MySQL中:以下加入語句有效嗎?
FROM a
JOIN b on a.c = b.c and b.c = 1
那麼它不會像這樣工作,但是當我使用右連接的b.c = 1被忽略。 這是爲什麼?
它不是在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 = 1
到WHERE
子句意味着只有1行會被不2返回),其中過濾器被放置,但我
對於不要緊的INNER JOIN
的情況下找到更合理的過濾器,關注JOIN
中的2個表格和WHERE
那麼我如何'LEFT JOIN'而不添加過濾行?如果我使用'WHERE'子句,則連接會變慢,因爲需要連接更多的行,對嗎? – hidarikani
請參閱編輯我的答案。 –
對不起,我的意思是'RIGHT JOIN'在評論中,但我想我現在明白了。 – hidarikani
額外的條件,爲什麼不把它寫這樣使它更清晰:
FROM a
JOIN b on a.c = b.c
WHERE b.c = 1
您應該將所有條件放在連接子句的表「b」上 –
remi - 爲什麼?是否應該在ON或WHERE子句中放置一個條件取決於它是否與連接操作的邏輯或整個查詢的邏輯有關。 – Hammerite
@Hammerite - 我以爲remi正在考慮'RIGHT JOIN'的情況,但它看起來好像是一個附加問題,原本並不存在。 –
中的所有其他表格之間的關係是否有效。
但是,當您使用正確的連接時,除了那些人之外,您將有效地獲得「正確」表中不滿足連接條件的所有值。這就是正確的加入
在這種情況下,使用where子句來限制從表b中提取的內容。
從 RIGHT JOIN B在交流轉換器= b.c WHERE b.c = 1
爲什麼不嘗試一下,看看會發生什麼? – Mac