2014-10-08 55 views
1

我有一個關於在這裏創建視圖的問題。我想出了一個快速的例子來說明這個問題。使用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。

這可能嗎?或者,如果父視圖在視圖中被左連接,我必須繼續對所有內容進行左連接嗎?

回答

1

我認爲這個鏈接回答您的問題:http://weblogs.sqlteam.com/jeffs/archive/2007/10/11/mixing-inner-outer-joins-sql.aspx

總結:

  • LEFT JOIN後面是左連接...
  • ...這可能會導致 「虧損」在這種情況下,您可能需要使用子查詢處理它。

對於您的情況爲例:

SELECT * 
FROM ContractHeader CH 
    INNER JOIN ContractStatus CS ON CH.ContractStatusID = CS.ContractStatusID 
    LEFT JOIN Contacts CON ON CH.ContactID = CON.ContactID 
    LEFT JOIN (
     SELECT * FROM ContractLineItem CLI 
     INNER JOIN ContractLineItemStatus CLIS ON CLI.ContractLineItemStatusID = CLIS.ContractLineStatusID 
    ) AS CLI_AND_S ON CH.ContractID = CLI_AND_S.ContractID 

因此,要回答你的問題:沒有,如果你使用一個內連接後,你的左邊加入,你會失去一些沒有ContractLineItem的ContractHeader。喲可以通過使用子查詢來保留ContractLineItem和ContractLineItemStatus之間的內部聯接。

編輯:取代了以往的查詢,其不應該有工作

0

如果您在ContractLineItem和ContractLineItemStatus表之間放置了一個INNER JOIN(如果沒有關於一個ContractStatus的ContractLineItem),那麼您將削減這些ContractStatus行。因此,如果您的初始目標是查看所有ContractStatus,無論是否有其他信息,都不能在這兩個表格之間應用INNER JOIN

+0

以爲我看錯所以我刪除了評論,然後我意識到我沒有^^ 最初的目標是查看與他們的頭所有合同和LineItem信息,當然還有它們的狀態。所有ContractLineItems和ContractHeaders都有狀態,所以INNER JOIN將在Contract上工作100%,但是如果我在ContractLineItem和ContractLineItemStatus之間使用INNER JOIN,那麼只要ContractHeader沒有ContractLineItem,我就會丟失所有記錄 – 2014-10-08 10:03:02

+0

@IvanM :你寫道:如果我在ContractLineItem和ContractLineItemStatus之間使用INNER JOIN,只要ContractHeader沒有ContractLineItem,我就會丟失所有記錄。我說:確切的。所以如果你不想丟失這些行,你就不能使用INNER JOIN。否則是的。 ;) – 2014-10-08 10:04:45