簡體   English   中英

條件是JOIN子句中的惡SQL

[英]Is condition in the JOIN clause evil SQL

在JOIN子句或WHERE子句中使用SQL條件更好嗎? 是否針對這兩種方式優化了SQL引擎? 它取決於發動機嗎?

是否始終可以通過WHERE子句中的條件替換JOIN子句中的條件?

這里舉例說明我的意思

SELECT      role_.name
FROM        user_role
INNER JOIN  user ON user_role.user_id_ = user.id AND
                    user_role.user_id_ = @user_id
INNER JOIN  role ON user_role.role_id = role_.id

SELECT      role_.name
FROM        user_role
INNER JOIN  user ON user_role.user_id_ = user.id
INNER JOIN  role ON user_role.role_id = role_.id
WHERE       user.id = @user_id

如果使用INNER JOIN,JOIN子句和WHERE條件中的SQL條件是等效的。

否則,如果使用任何其他JOIN(如LEFT / RIGHT)而不是基於條件匹配行之后,則會發生另一個步驟,即添加OUTER ROWS,即非匹配行。

WHERE條件只是過濾掉所有不匹配的行。

看到這個帖子

在join子句中使用非鍵條件不僅好,特別是在此查詢中更好,因為您可以避免與進一步連接到on子句所屬的表的其他表的某些連接。

完成所有連接評估Where子句 - 它是結果集上的過濾器。 但是通過將條件放在join子句中,您可以在他們加入時停止正在連接的行。

在你的情況下它沒有任何區別,因為你沒有任何下面的表,但我經常使用他的技術來獲得我的查詢中的性能。

通過查看為兩個查詢生成的計划,我們可以看到在INNER JOIN或WHERE子句中具有條件會生成相同的計划。

但是在WHERE子句中使用條件的問題是你無法處理OUTER JOIN

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM