加入几个表和视图

时间:2012-04-11 09:51:01

标签: sql sql-server database view

  SELECT  dbo.Monitor_Request.WorkDesc
          , dbo.Monitor_Request.Request_ID
          , dbo.Monitor_Request.Due_Dt
          , dbo.Monitor_Request.Attempts
          , dbo.Monitor_Request.Status_Ind
          , dbo.Monitor_Request.Create_Dt
          , dbo.Monitor_Request.Monitor_ID
          , dbo.Monitor_Request.ByCustomer_ID
          , dbo.Monitor_Request.ByCompanyID
          , dbo.CompanyShim.Company_Name
          , dbo.PostalAddressShim.HouseName
          , dbo.PostalAddressShim.Street
          , dbo.PostalAddressShim.Town
          , dbo.PostalAddressShim.City
          , dbo.PostalAddressShim.County
          , dbo.PostalAddressShim.Postcode
    FROM  dbo.PostalAddressShim 
          RIGHT OUTER JOIN dbo.CompanyShim ON dbo.PostalAddressShim.Address_ID = dbo.CompanyShim.Company_Address_ID 
          RIGHT OUTER JOIN dbo.CUSTOMER ON dbo.PostalAddressShim.Address_ID = dbo.CUSTOMER.Address_ID 
          RIGHT OUTER JOIN dbo.Monitor_Request ON dbo.CUSTOMER.Customer_ID = dbo.Monitor_Request.ByCustomer_ID 
                                                  AND dbo.CompanyShim.Company_ID = dbo.Monitor_Request.ByCompanyID

我创建了一个视图,用他们的地址显示客户详细信息。客户可以是个人或公司。它们存储在不同的表中。对于个人,详细信息存储在名为Customer的表中,公司详细信息存储在Company表中。我正在尝试创建数据库中所有客户的视图以显示其地址。当我单独加入表格时,我得到了地址详细信息但是如果我同时加入这两个表格(客户和公司),我没有获得地址详细信息列的空值。

如何从数据库中获取客户(个人或公司)的所有地址详细信息

2 个答案:

答案 0 :(得分:0)

乍一看,请尝试将RIGHT OUTER JOIN更改为LEFT OUTER JOIN s。

答案 1 :(得分:0)

我很少发现需要使用RIGHT OUTER JOIN,每次遇到它时,都会迫使我从右到左思考使事情复杂化。

如果我没有表现得很糟糕,那么以下联接应该等同于你所写的内容

SQL声明

dbo.Monitor_Request mr 
LEFT OUTER JOIN dbo.Customer c ON c.Customer_ID = mr.ByCustomerID
LEFT OUTER JOIN dbo.CompanyShim cs ON cs.Company_ID = mr.ByCompanyID
LEFT OUTER JOIN dbo.PostalAddressShim pas ON pas.Address_ID = c.Address_ID
                                             AND pas.Address_ID = cs.Company_Address_ID

现在这是我可以阅读和理论化的内容。从这一陈述中可以明显看出,AND条款与客户和公司加入地址有效地相互否定并且根本没有回复任何地址。

我猜你应该只是

  • 将您的RIGHT JOINS替换为LEFT JOINS
  • 使用OR代替AND

SQL声明

dbo.Monitor_Request mr 
LEFT OUTER JOIN dbo.Customer c ON c.Customer_ID = mr.ByCustomerID
LEFT OUTER JOIN dbo.CompanyShim cs ON cs.Company_ID = mr.ByCompanyID
LEFT OUTER JOIN dbo.PostalAddressShim pas ON pas.Address_ID = c.Address_ID
                                             OR pas.Address_ID = cs.Company_Address_ID