2012-04-11 76 views
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表中。我试图创建一个数据库中所有客户的视图来显示他们的地址。当我单独加入表格时,我会收到地址详细信息,但如果我同时加入两个表格(客户和公司),则不会为地址详细信息列获取空值。加入多个表格和视图

我怎样才能从数据库

回答

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条款将客户和公司加入到地址中,从而有效地相互否定,并且根本没有返回任何地址。

我的猜测是,你应该简单地

  • 替换,而不是AND

SQL语句的RIGHT JOINSLEFT JOINS

  • 使用OR

    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 
    
  • 0

    乍一看客户(个人或公司)的所有详细地址,尝试改变你的RIGHT OUTER JOIN s到LEFT OUTER JOIN秒。