簡體   English   中英

在SQL Server中聯接兩個表時,在哪里檢查組合鍵的一部分有關系嗎?

[英]Does it matter where I check part of a composite key when joining two tables in SQL Server?

我要在一個組合鍵上連接兩個表,並且想知道在進行連接時比較相應列的位置是否重要。

假設我有一個表TableA,其中包含列ColAFoo,ColAFoo2和ColABar。 TableA具有包含ColAFoo和ColAFoo2(PK_TableA)的復合主鍵。

我也有TableB,以及ColBFoo,ColBFoo2和ColBOther。 TableB的列ColBFoo和ColBFoo2構成了TableA的主鍵(FK_TableA_TableB)的外鍵。

我需要將兩個表連接到鍵上。 在性能方面,以下三個(特別是人為)語句之間有區別嗎?

SELECT *
  FROM TableA a
  JOIN TableB b
    ON  a.ColAFoo = b.ColBFoo
        AND a.ColAFoo2 = b.ColBFoo2

SELECT *
  FROM TableA a
  JOIN TableB b
    ON  a.ColAFoo = b.ColBFoo
  WHERE a.ColAFoo2 = b.ColBFoo2

-- this one is a little /too/ contrived, apparently (see comments)

 

 
 
 
  
  
  
 
  SELECT *
  FROM TableA a
  JOIN TableB b
  WHERE a.ColAFoo = b.ColBFoo
        AND a.ColAFoo2 = b.ColBFoo2
 

 
 
 

對於inner join聯接,以下結果是等效的,並且可能會產生相同的查詢計划:

SELECT *
  FROM TableA a
  JOIN TableB b
    ON  a.ColAFoo = b.ColBFoo
        AND a.ColAFoo2 = b.ColBFoo2

SELECT *
  FROM TableA a
  JOIN TableB b
    ON  a.ColAFoo = b.ColBFoo
  WHERE a.ColAFoo2 = b.ColBFoo2

-- SQL89 inner join:
SELECT *
  FROM TableA a, TableB b
 WHERE a.ColAFoo = b.ColBFoo
       AND a.ColAFoo2 = b.ColBFoo2

但是,將連接條件放在ON子句中將與其他程序員交流,“嘿!這是將表關聯在一起的條件。” 與where子句中的內容相對,即“連接完成后限制結果的標准”。

另外,使用outer join ,條件的放置在結果上有很大的不同,因此在所有情況下都應將聯接條件置於on

如果您只有一個INNER JOIN,則3個都相同。
對於LEFT / RIGHT連接,它們是完全不同的。

這沒什么區別。 優化器將以相同的方式解析它們。 我的個人喜好將是您的第一個例子。

SELECT *
  FROM TableA a
    JOIN TableB b
      ON  a.ColAFoo = b.ColBFoo
        AND a.ColAFoo2 = b.ColBFoo2

從理論上講,第一種方法是最好的:

SELECT *
  FROM TableA a
  JOIN TableB b
    ON  a.ColAFoo = b.ColBFoo
        AND a.ColAFoo2 = b.ColBFoo2

當您指定TableA和TableB之間的關系時,這可能對優化程序有所幫​​助。 實際上,數據庫已經知道這一點(特別是如果您已建立外鍵關系),因此這實際上並不重要。

如果有2張桌子,那沒關系。 如果您聯接許多表,請不要忘記聯接后要處理where子句,因此,如果您過濾記錄(可以在WHERE的INNER JOIN ON部分中進行過濾),則性能可能會有顯着差異。

對於人為設計的版本,沒有關系。 但是,我絕對可以看到是否還有其他JOIN或WHERE子句。

暫無
暫無

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

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