Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 一行多行_Sql Server_Tsql - Fatal编程技术网

Sql server 一行多行

Sql server 一行多行,sql-server,tsql,Sql Server,Tsql,我知道也有类似的问题,但不幸的是,我还没有找到相应的解决方案 首先,这里是我的表格的简化概述: 合作伙伴表:合作伙伴ID、名称 地址表格:合作伙伴ID、街道、邮政编码、城市、有效期自 联系人表格:PartnerID、TypID、TelNr、Email、ValidFrom 合作伙伴可以有一个或多个地址以及联系信息。有了联系信息,合作伙伴可以有2个电话号码、1个手机号码和1封电子邮件。在表中,它将如下所示: PartnerID TypID TelNr

我知道也有类似的问题,但不幸的是,我还没有找到相应的解决方案

首先,这里是我的表格的简化概述:

  • 合作伙伴
    表:
    合作伙伴ID、名称

  • 地址
    表格:
    合作伙伴ID、街道、邮政编码、城市、有效期自

  • 联系人
    表格:
    PartnerID、TypID、TelNr、Email、ValidFrom

合作伙伴可以有一个或多个地址以及联系信息。有了联系信息,合作伙伴可以有2个电话号码、1个手机号码和1封电子邮件。在表中,它将如下所示:

PartnerID   TypID   TelNr                   Email               ValidFrom
1           1       0041 / 044 - 2002020                        01.01.2010
1           1       0041 / 044 - 2003030                        01.01.2011
1           2       0041 / 079 - 7003030                        01.04.2011
1           3                               myemail@hotmail.com 01.06.2011
PartnerID   Name    Street              Postcode        City            TelNr                               Email
1           SomeGuy MostActualStreet    MostActualPC    MostActualCity  MostActual Nr (either type 1 or 2)  MostActual Email
我最终需要的是,将每个合作伙伴的所有表组合起来,如下所示:

PartnerID   TypID   TelNr                   Email               ValidFrom
1           1       0041 / 044 - 2002020                        01.01.2010
1           1       0041 / 044 - 2003030                        01.01.2011
1           2       0041 / 079 - 7003030                        01.04.2011
1           3                               myemail@hotmail.com 01.06.2011
PartnerID   Name    Street              Postcode        City            TelNr                               Email
1           SomeGuy MostActualStreet    MostActualPC    MostActualCity  MostActual Nr (either type 1 or 2)  MostActual Email

有什么帮助吗?

请查看我在另一篇文章中的答案,该文章解释了如何在类似您的案例中获得最真实的信息:


注:DATE_字段在您的案例中是有效的。

这里有一些T-SQL,它可以通过“最实际的”得到您想要的答案 你是说“最近的”:

分解它,本例使用(CTE)获取每个合作伙伴的最新地址信息

WITH LatestAddress (PartnerID,Street,PostCode,City) 
AS (
    SELECT PartnerID,Street,PostCode,City
    FROM [Address] a
    WHERE ValidFrom = (
        SELECT MAX(ValidFrom) 
        FROM [Address] aMax 
        WHERE aMax.PartnerID = a.PartnerID
    )
)
我将Partner表中的join保留到CTE,因为我不希望没有地址的Partner被排除在结果之外

FROM [Partner] p
LEFT OUTER JOIN LatestAddress la ON p.PartnerID = la.PartnerID
在SELECT语句中,我从Partner表CTE中选择了列,并编写了两个子选择,一个用于每个Partner的最新非空电话号码,另一个用于每个Partner的最新非空电子邮件地址。我可以作为一个子选择来执行此操作,因为我知道通过选择前1返回的是一个标量值

SELECT p.PartnerID,p.Name,la.Street,la.PostCode,la.City
,(SELECT TOP 1 TelNr FROM Contact c WHERE c.PartnerID = p.PartnerID AND TelNr IS NOT NULL ORDER BY ValidFrom DESC) AS MostRecentTelNr
,(SELECT TOP 1 Email FROM Contact c WHERE c.PartnerID = p.PartnerID AND Email IS NOT NULL ORDER BY ValidFrom DESC) AS MostRecentEmail

我强烈建议您将联系人表分为单独的电话号码表和电子邮件表,如果您需要保留旧的电话号码和电子邮件地址,每个表都有自己的ValidDate。

您使用的是什么版本的SQL Server?