2013-02-22 70 views
0

當使用子聯接時,我注意到了生成相同結果的兩種不同方式。在子連接中,使用'select'連接兩個表,然後給它一個在後續行上引用的別名。另一個只是'匿名'連接兩個表,後面的行使用Sub-Join的表別名。我有下面的示例代碼。我的問題是:SQL子加入語法

  1. 這些是否相同,只是保存鍵擊?

  2. 是否使用'select'創建臨時表而另一個不是?

  3. 兩者之間會有性能差異嗎?我不認爲會基於執行分析器,但我想我會問。

  4. 是否有一個「名稱」爲一個或他人次加入式「(如別名次加入與匿名子加入?)

  5. 至於表的別名的作用域規則和列名,是否有任何好文件,有人可以指出我可以解釋這些情況?我已搜索並找不到任何匹配的內容(儘管我不確定我是否正確搜索)?

這裏有兩個查詢:

SELECT bp1.*, b1.* 
from Bugs b1 
JOIN BugsProducts bp1 ON b1.bug_id = bp1.bug_id 
LEFT OUTER JOIN (select b2.*, bp2.product_id 
       from Bugs b2 
       JOIN BugsProducts bp2 ON b2.bug_id = bp2.bug_id) AS sub1 
ON (bp1.product_id = sub1.product_id AND (b1.date_reported < sub1.date_reported)) 
WHERE sub1.bug_id IS NULL; 

SELECT bp1.*, b1.* 
from Bugs b1 
JOIN BugsProducts bp1 ON b1.bug_id = bp1.bug_id 
LEFT OUTER JOIN (Bugs b2 JOIN BugsProducts bp2 ON b2.bug_id = bp2.bug_id) 
ON (bp1.product_id = bp2.product_id AND (b1.date_reported < b2.date_reported)) 
WHERE b2.bug_id IS NULL; 

回答

0

你能不能用呢? :

SELECT bp1.*, b1.* 
FROM bugs b1, bugsproducts bp1 
WHERE b1.bug_id = bp1.bug_id AND b1.bug_is IS NULL 

作爲別名似乎更容易給我,更清潔和更短的代碼

又該

(b1.date_reported < b2.date_reported) 

回報,心不是B1 =錯誤和b2 =錯誤,從而在同一個表

+0

感謝約翰,但我的問題不是如何使查詢工作。問題基本上是「這兩個查詢有什麼區別?「我試圖理解爲什麼一種查詢方式比另一種更好(如果它是的話)。 – steve 2013-02-23 15:18:27

1

我進一步研究了這個主題,並找到了我正在尋找的答案。我希望這可以幫助未來的其他人。

在「子查詢」上執行JOIN時(如第一種情況),必須爲子查詢提供別名,因此在引用該子查詢中的數據時必須使用該別名。加入子查詢可以更詳細地控制將返回哪些字段以及如何格式化等等,所以在某些情況下,當您需要「定製」數據時,這可能更可取。從這樣的子查詢返回的數據可能被稱爲「虛擬表」或「派生表」等等。

我的例子中的第二種情況就是'Mutli-Join'。它本身沒有什麼特別之處。它涉及的輸入較少,並且在不需要自定義返回字段時可能更可取。

這兩個查詢都會在我的環境中生成相同的執行路徑。因人而異。

這裏是一個很好的文章這就解釋了子查詢和連接(以及其他子查詢主題)爲一個更完整的描述: https://www.simple-talk.com/sql/sql-training/subqueries-in-sql-server/