Sql 创建具有左连接和内连接的视图

Sql 创建具有左连接和内连接的视图,sql,left-join,inner-join,Sql,Left Join,Inner Join,我有一个关于在这里创建视图的问题。我想出了一个简单的例子来说明这个问题 合同有标题和行项目 合同标题和行项目在不同的表中具有不同的状态,并且是必需的(非空) 合同头不需要ContactID 见下表: [Contacts] PK.ContactID ContactName [ContractHeader] PK.ContractID ContractThruDate FK.ContactID FK.ContractStatusID (REQUIRED) [ContractStatus] P

我有一个关于在这里创建视图的问题。我想出了一个简单的例子来说明这个问题

  • 合同有标题和行项目
  • 合同标题和行项目在不同的表中具有不同的状态,并且是必需的(非空)
  • 合同头不需要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、ContractStatus和ContractLineItems,因此我可以轻松添加

   ...
   LEFT JOIN ContractLineItemStatus CLIS ON CLI.ContractLineItemStatusID = CLIS.ContractLineStatusID
但是,由于在联接ContractLineItem时需要ContractLineItemStatus,因此我希望在ContractLineItem的左联接内联接ContractLineStatus


可能吗?或者,一旦父项在视图中被左联接,我是否必须继续对所有内容执行左联接?

如果在ContractLineItem和ContractLineItemStatus表之间放置一个
内部联接
,如果没有ContractLineItem关于一个ContractStatus,则将剪切这些ContractStatus行。因此,如果您最初的目标是查看所有ContractStatus,无论是否有其他信息,您都不能在这两个表之间应用
内部联接。

我认为此链接回答了您的问题:

总之:

  • 左连接后接左连接
  • 。。。这可能会导致信息“丢失”,在这种情况下,您可能需要使用子查询来处理它
对于您的示例:

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。Yo可以使用子查询保留ContractLineItem和ContractLineItemStatus之间的内部联接


编辑:替换了之前的查询,该查询本不应该工作

认为我读错了,所以我删除了注释,然后我意识到我没有^^^最初的目标是查看所有合同及其标题和行项目信息,当然还有它们的状态。所有ContractLineItems和ContractHeader都有状态,因此内部联接将100%适用于Contract,但如果我在ContractLineItem和ContractLineItemStatus之间使用内部联接,一旦合同头没有记录,我就会丢失所有记录ContractLineItem@IvanM:您写道:如果我在ContractLineItem和ContractLineItemStatus之间使用内部联接,那么一旦ContractHeader没有ContractLineItem,我就会丢失所有记录。我说:准确。因此,如果不想丢失这些行,就不能使用内部联接。否则是的