2016-11-10 91 views
1

我想,我可能有一個誤解,多連接如何在多個表上工作。假設你有三張表A,B,C,你需要加入他們。內連接多個表

這裏是V1

SELECT A.NAME AS name1 
    ,B.NAME AS name2 
    ,C.NAME AS name3 
FROM A 
INNER JOIN B 
    ON A.id = B.id 
INNER JOIN C 
    ON B.id = C.id 

這裏是V2

SELECT A.NAME AS name1 
    ,D.NAME AS name2 
    ,D.NAME AS name3 
FROM A 
INNER JOIN (
    SELECT B.NAME AS name2 
     ,C.NAME AS name3 
    FROM B 
    INNER JOIN C 
     ON B.id = C.id 
    ) AS D 
    ON A.id = D.id 

是否有這兩個版本之間的性能差異? 儘管第一個查詢看起來更清晰,但我需要構建一個查詢生成器UI,將聯接限制爲只有2個表有所幫助。

+0

那麼,作爲第一個,第二個查詢將失敗,因爲你沒有選擇內部查詢中的'Id'。但更重要的是,這些不是同一個查詢。在第一個中,你將'A'與'B'和'A'與'C'聯繫起來。第二,你將'B'關聯到'C',這在第一個查詢中不是定義的關係。不僅如此,第二個版本更難以閱讀/理解。你應該堅持第一個版本 - 它更乾淨,更易於理解。 – Siyual

+0

@Siyual - 兩個連接中隱含的B到C關係 - 不會加入B ON A.id = B.id JOIN C ON A.id = C.id給出與JOIN B ON相同的結果A.id = B.id JOIN C ON B.id = C.id – PaulF

+0

@PaulF在這種情況下,推斷B到C關係的唯一方法是如果您加入了「ID」字段中的表對於所有三個(這與他的例子一樣,儘管這看起來像虛擬代碼,而不是他實際使用的)。 *但是,我非常懷疑你需要在三個表中進行連接,每個表的主鍵都是相同的。如果是這樣的話,那麼是的,你可以推斷B到C的關係。但除此之外,你無法建立連接。 – Siyual

回答

1

一般來說,子查詢的一個問題是,它可能需要RDBMS創建一個臨時表來完成子查詢 - 並且在一個足夠大的表上這可能是一個嚴重的開銷 - 並且可能不能使用任何索引子查詢優化查詢,然後掃描表。

當然,DDL和表的大小不包括在內,所以最好的方法是讓Postgres解釋它計劃做什麼和比較/對比。