0

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

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

  • Partner桌子:PartnerID, Name

  • Address桌子:PartnerID, Street, Postcode, City, ValidFrom

  • Contact桌子: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

有什么帮助吗?

4

2 回答 2

1

这里有一些 T-SQL 可以得到我认为你正在寻找的答案,如果“最实际”的意思是“最近的”:

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
    )
)

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
FROM [Partner] p
LEFT OUTER JOIN LatestAddress la ON p.PartnerID = la.PartnerID

分解一下,这个例子使用公用表表达式(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
    )
)

我从合作伙伴表左连接到 CTE,因为我不希望没有地址的合作伙伴被排除在结果之外。

FROM [Partner] p
LEFT OUTER JOIN LatestAddress la ON p.PartnerID = la.PartnerID

在 SELECT 语句中,我从 Partner 表 CTE 中选择列,并编写了两个子选择,一个用于每个合作伙伴的最新非空电话号码,一个用于每个合作伙伴的最新非空电子邮件地址。我能够将其作为子选择来执行,因为我知道通过选择 TOP 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。

于 2012-11-05T20:15:34.327 回答
0

在另一篇文章中查看我的答案,该文章解释了如何在像您这样的情况下获取最实际的信息:Aggregate SQL Function to grab only the first from each group

PS:在您的情况下, DATE_FIELD 将是 ValidFrom 。

于 2012-11-05T15:30:15.650 回答