2008-08-14 63 views
4

當我通過一個公共列連接三個或多個表一起,我會寫我的查詢是這樣的:在SQL中顯式連接傳遞閉包的優點是什麼?

SELECT * 
FROM a, b, c 
WHERE a.id = b.id 
AND b.id = c.id 

一個同事最近問我,爲什麼我沒有做明確的連接傳遞閉在我這樣的查詢中:

SELECT * 
FROM a, b, c 
WHERE a.id = b.id 
AND b.id = c.id 
AND c.id = a.id 

這真的有什麼好處嗎?當然,優化器可以自己暗示這一點?

編輯:我知道這是邪惡的語法,但它是合法的遺留代碼+1一個快速和骯髒的例子@Stu清潔起來

回答

4

你不需要在今天的數據庫引擎中這樣做,但是有一段時間這樣的事情會給查詢優化器提供更多關於可能的索引路徑的提示,從而加快結果。

無論如何,現在整個語法都會出去。

2

沒有這句法從天莖之前聯接均在語言。不確定與它相關的問題,但肯定有更多支持連接表的語言結構。

1

如果你從數學的角度來看它,你的例子應該會產生相同的結果。

A = B = C

所以,你的第一個例子會產生相同的結果作爲第二個,所以不需要做額外的工作。

1

我只想說這種加入是魔鬼的工作。
想想吧;加入和過濾的條件在where語句中混合在一起。
當您需要連接20個表格並過濾15個值時會發生什麼?

再次,只是我的$ .02

1

在Microsoft SQL這兩個查詢的查詢計劃是相同的 - 他們都以同樣的方式執行。

4

這是骯髒的,邪惡的遺留語法。你寫這是

Select 
    * -- Oh, and don't ever use *, either 
From 
    A 
    Inner Join B On A.ID = B.ID 
    Inner Join C On B.ID = C.ID 
-1

這句法雖然有它的用途......有些時候,你發現你需要連接兩張表上的多個領域

+0

您可以使用常規連接語法 FROM table1 t1。 在t1.field1上聯接table2 t2 = t2.field1和t.field2 = t2.field2 – HLGEM 2009-04-20 14:41:55

0

這個問題類似於這一個在這裏有非常深入的解釋:

SQL question from Joel Spolsky article

簡短的回答是,該transitiv財產MA的顯式聲明y加快查詢速度。這是因爲查詢優化不是一項簡單的任務,有些SQL服務器可能會遇到問題。

相關問題