0
  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 表中。我正在尝试创建数据库中所有客户的视图以显示他们的地址。当我分别加入表格时,我得到了地址详细信息,但如果我同时加入两个表(客户和公司),我没有得到地址详细信息列的空值。

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

4

2 回答 2

0

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

于 2012-04-11T10:08:35.910 回答
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 JOINSLEFT 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
于 2012-04-11T10:11:17.477 回答