亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在聯接或位置內的條件

在聯接或位置內的條件

喵喵時光機 2019-07-15 10:39:17
在聯接或位置內的條件有什么不同(表現、最佳實踐等.)在JOIN子句中添加條件與WHERE子句之間?例如.。-- Condition in JOINSELECT *FROM dbo.Customers AS CUSINNER JOIN dbo.Orders AS ORD  ON CUS.CustomerID = ORD.CustomerIDAND CUS.FirstName = 'John'-- Condition in WHERESELECT *FROM  dbo.Customers AS CUSINNER JOIN dbo.Orders AS ORD  ON CUS.CustomerID = ORD.CustomerIDWHERE CUS.FirstName = 'John'你喜歡哪一個(也許是為什么)?
查看完整描述

3 回答

?
蕪湖不蕪

TA貢獻1796條經驗 獲得超7個贊

對于內部連接,我并沒有真正注意到它們之間的區別(但是與所有性能調優一樣,您需要在您的條件下對照數據庫進行檢查)。

然而,如果您使用的是左或右聯接,則條件會產生巨大的不同。例如,考慮以下兩個查詢:

SELECT *FROM dbo.Customers AS CUS 
LEFT JOIN dbo.Orders AS ORD 
ON CUS.CustomerID = ORD.CustomerIDWHERE ORD.OrderDate >'20090515'SELECT *FROM dbo.Customers AS CUS 
LEFT JOIN dbo.Orders AS ORD 
ON CUS.CustomerID = ORD.CustomerIDAND ORD.OrderDate >'20090515'

第一個將只給出那些日期晚于2009年5月15日的訂單記錄,從而將左連接轉換為內部連接。第二個會給出這些記錄,再加上沒有訂單的任何客戶。結果集非常不同,取決于您放置條件的位置。(如果僅選擇*,則不應在生產代碼中使用。)這種情況的例外情況是,您只希望在一個表中看到記錄,而不希望看到另一個表中的記錄。然后,對條件使用WHERE子句,而不是JOIN。

SELECT *FROM dbo.Customers AS CUS 
LEFT JOIN dbo.Orders AS ORD 
ON CUS.CustomerID = ORD.CustomerIDWHERE ORD.OrderID is null


查看完整回答
反對 回復 2019-07-15
?
楊__羊羊

TA貢獻1943條經驗 獲得超7個贊

大多數RDBMS產品將對這兩個查詢進行相同的優化。在PeterGulutzan和TrudyPelzer的“SQL性能調優”中,他們測試了多個品牌的RDBMS,發現性能沒有差別。

我更喜歡將聯接條件與查詢限制條件分開。

如果你用OUTER JOIN有時,在JOIN子句中添加條件是必要的。


查看完整回答
反對 回復 2019-07-15
  • 3 回答
  • 0 關注
  • 748 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號