2011-04-25 101 views
0

我正在回顧一些前段時間寫到的SQL,它將4個表加入公共ID列。我開始有點偏執約我加盟,我希望有人能清楚只是這個簡單的概念對我:跨4個表加入1列 - Mysql

SELECT A.adata, B.bdata, C.cdata, D.ddata 
FROM taba A, tabb B, tabc C, tabd D 
WHERE A.id=B.id AND B.id=C.id AND C.id=D.id 
AND A.id=C.id AND A.id=D.id AND B.id=D.id 

我需要所有這些和條款,或者我可以消除過去的3,這樣:

SELECT A.adata, B.bdata, C.cdata, D.ddata 
FROM taba A, tabb B, tabc C, tabd D 
WHERE A.id=B.id AND B.id=C.id AND C.id=D.id 

雖然我已經成功地測試了我的數據集較小的查詢,它似乎產生相同的結果,我不希望有一些不完整的SQL回來困擾我。另一方面,我不想加載不必要的條件。讓我知道我是否可以提供更多信息。

- 更新,謝謝大家的答案。關於表格:它們相對靜態,儘管行中的一些值在整個一天中都會改變。每個表A,B,C,D存儲關於OBJECT的不同信息,並且OBJECT ID在所有4箇中都是公共的,所以在這裏非常簡單。

+1

連接完全依賴於您的表結構。一個適當規範化的設計不會有表A/C,A/D和B/D直接相互依賴,但只通過鏈接表間接依賴。 – 2011-04-25 18:27:34

回答

0

更好的解決方案,使其更容易閱讀是使用ISO/ANSI加入語法:

Select A.adata, B.bdata, C.cdata, D.ddata 
From taba As A 
    Inner Join tabb As B 
     On B.id = A.id 
    Inner Join tabc As C 
     On C.id = B.id 
    Inner Join tabd As D 
     On D.id = C.Id 
+0

我喜歡這個,但是你不會把所有的關鍵字都大寫嗎? – colinmarc 2011-04-25 18:45:29

+0

@colinmarc - 這是一種文體偏好。國際海事組織不再被要求的一個,使它更難以閱讀和難以打字。 – Thomas 2011-04-25 18:47:16

+0

我很同意打字,但絕對不容易閱讀。對每個他自己我猜=) – colinmarc 2011-04-25 18:48:55

0

我同意你應該使用INNER JOIN語法,使其更容易遵循。

但是你也應該記住,那些AND子句可能被優化器使用。不知道你的桌子是如何建造的,我不能肯定地說。但總的來說,如果您告訴數據庫基於兩列進行連接,它將嘗試使用索引(如果存在)。如果您使用「傳遞屬性」來替換那些,那麼您可能會使查詢運行速度變慢。

只是一個警告。這取決於你的具體表結構。

如果您測試了它,並且運行速度同樣快,那可能就沒有問題。但是桌子在增長嗎?它可能會隨着時間的推移失敗?我會擔心這一點,並在進行更改之前使用非常大的表格進行測試。