我有一個關於在這裏創建視圖的問題。我想出了一個快速的例子來說明這個問題。使用LEFT和INNER JOIN創建視圖
- 合同有頭和行項目。
- 合同集管以及行項目具有不同的表都不同的狀態,並且需要(不是null) 不需要
- 的ContactID爲合同部首
見下面的表:
[Contacts]
PK.ContactID
ContactName
[ContractHeader]
PK.ContractID
ContractThruDate
FK.ContactID
FK.ContractStatusID (REQUIRED)
[ContractStatus]
PK.ContractStatusID
ContractStatusName
[ContractLineItem]
PK.ContractLineItemID
ContractLineItemDate
ContractLineItemName
FK.ContractLineItemStatusID (REQUIRED)
FK.ContractID
[ContractLineItemStatus]
PK.ContractLineItemStatusID
ContractLineItemStatusName
現在,如果我想創建一個完整的視圖,我會這樣做:
SELECT *
FROM ContractHeader CH
INNER JOIN ContractStatus CS ON CH.ContractStatusID = CS.ContractStatusID
LEFT JOIN Contacts CON ON CH.ContactID = CON.ContactID
LEFT JOIN ContractLineItem CLI ON CLI.ContractID = CH.ContractID
...
到目前爲止,我有聯繫,ContractHeader,ContractStatuses和ContractLineItems,所以我可以輕鬆地添加
...
LEFT JOIN ContractLineItemStatus CLIS ON CLI.ContractLineItemStatusID = CLIS.ContractLineStatusID
但由於ContractLineItemStatus需要時ContractLineItem的加盟,我會想內蒙古LEFT JOIN的內JOIN的ContractLineStatus ContractLineItem。
這可能嗎?或者,如果父視圖在視圖中被左連接,我必須繼續對所有內容進行左連接嗎?
以爲我看錯所以我刪除了評論,然後我意識到我沒有^^ 最初的目標是查看與他們的頭所有合同和LineItem信息,當然還有它們的狀態。所有ContractLineItems和ContractHeaders都有狀態,所以INNER JOIN將在Contract上工作100%,但是如果我在ContractLineItem和ContractLineItemStatus之間使用INNER JOIN,那麼只要ContractHeader沒有ContractLineItem,我就會丟失所有記錄 – 2014-10-08 10:03:02
@IvanM :你寫道:如果我在ContractLineItem和ContractLineItemStatus之間使用INNER JOIN,只要ContractHeader沒有ContractLineItem,我就會丟失所有記錄。我說:確切的。所以如果你不想丟失這些行,你就不能使用INNER JOIN。否則是的。 ;) – 2014-10-08 10:04:45