【问题标题】:Joining several tables and views连接多个表和视图
【发布时间】:2012-04-11 09:51:01
【问题描述】:
  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 表中。我正在尝试创建数据库中所有客户的视图以显示他们的地址。当我单独加入表格时,我会得到地址详细信息,但如果我同时加入两个表(客户和公司),我不会得到地址详细信息列的空值。

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

【问题讨论】:

    标签: sql sql-server database view


    【解决方案1】:

    我很少发现需要使用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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-11
        • 2019-03-12
        • 2020-12-18
        • 2022-10-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多