TSQL - 如何从一个结果集中的多个表中加入 1..*?

Posted

技术标签:

【中文标题】TSQL - 如何从一个结果集中的多个表中加入 1..*?【英文标题】:TSQL - How to join 1..* from multiple tables in one resultset? 【发布时间】:2010-03-23 18:28:01 【问题描述】:

位置表记录有两个地址 ID - mailing 和业务地址 ID,它们引用地址表。

因此,地址表将包含给定地址 ID 的最多两条记录。

给定一个位置 ID,我需要一个存储过程来返回一个结果集中的所有 tbl_Location 字段和所有 tbl_Address 字段:

            LocationID INT,
            ClientID INT,
            LocationName NVARCHAR(50),
            LocationDescription NVARCHAR(50),
            MailingAddressID INT,
            BillingAddressID INT,
            MAddress1 NVARCHAR(255),
            MAddress2 NVARCHAR(255),
            MCity NVARCHAR(50),
            MState NVARCHAR(50),
            MZip NVARCHAR(10),
            MCountry CHAR(3),
            BAddress1 NVARCHAR(255),
            BAddress2 NVARCHAR(255),
            BCity NVARCHAR(50),
            BState NVARCHAR(50),
            BZip NVARCHAR(10),
            BCountry CHAR(3)

我首先创建了一个包含必填字段的临时表,但对于如何完成此操作有点卡住。

我可以为每个必需的地址字段做子选择,但看起来有点乱。

我已经有一个接受地址 ID 并返回该 ID 的所有字段的表值函数,但不知道如何将其集成到我需要的结果中。

顺便说一句,创建此表的选项似乎有 3 个 - 1:位置,2:邮寄地址,3:帐单地址。

我想做的只是创建一个视图并使用它。

任何帮助都会有所帮助。

谢谢。

【问题讨论】:

【参考方案1】:

类似以下的方法会起作用:

select L.*, 
a1.Address1 as MAddress1, a1.Address2 as MAddress2,
a2.Address1 as BAddress1, a2.Address2 as BAddress2
from location L
  inner join Address a1 on (a1.AddressId = L.MailingAddressId)
  inner join Address a2 on (a2.AddressId = L.BillingAddressId)

我没有填写所有字段,但你明白了。

请注意,如果任一地址 id 可能为空,您可能会使用左连接。

【讨论】:

+1,如果 location.MailingAddressId 或 BillingAddressId 可以为空,请将 inner joins 更改为 left joins【参考方案2】:

如果我正确理解了您的问题,您需要以下内容:

SELECT
    L.*,
    MAddress1 = M.Address1,
    MAddress2 = M.Address2,
    MCity = M.City,
    MState = M.State,
    MZip = M.Zip,
    MCountry = M.Country
    BAddress1 = B.Address1,
    BAddress2 = B.Address2,
    BCity = B.City,
    BState = B.State,
    BZip = B.Zip,
    BCountry = B.Country
FROM
    tbl_Location L
    INNER JOIN tbl_Address M
        ON L.MailingAddressID = M.MailingAddressID
    INNER JOIN tbl_Address B
        ON L.BillingAddressID = B.BillingAddressID
WHERE
    L.LocationID = @LocationID

【讨论】:

感谢 Chris 和 Tliebe。我接受了 Tliebe 的回答,因为我不需要做所有的 AS。两者都工作得很好,而且比我想太多的解决方案简单得多:)。

以上是关于TSQL - 如何从一个结果集中的多个表中加入 1..*?的主要内容,如果未能解决你的问题,请参考以下文章

如何从多个表中加入 SELECT,其中 SELECTS 基于不同的条件?

从多个表中加入 mysql 4.0 数据的最快方法?

SQL Alchemy奇怪的行为从同一个表中加入多个列

如何在 R2DBC 和 Spring WebFlux 中加入多个表?

如何在mysql查询的更新语句中加入多个表[重复]

如何在sql的查询结果中加入序号