2010-06-15 134 views
0

我试图实现版本化的数据SQL Server 2008查询

我有两个表客户端和地址。我在UI中显示,各种更新在其作出的命令,但与正确的客户端版本

所以,

Client Table         Address Table 
----------         ---------- 

Client Version Modified Date     Address Version ModifiedDate 
CV1    T1         AV1    T2 
CV2    T4         AV2    T3 
CV3    T5     

我的结果应该是

CV1  AV1 (first version) 
CV1  AV2 (as AV1 was updated at T3) 
CV2  AV2 (as Client got updated to CV2 at T4) 
CV3  AV2  (As client has got updated at T5) 
+0

是版本和日期都在同一个表作为两列或作为单列四列?如果您包含表格定义,样本数据和预期输出,那将更容易帮助您。 – 2010-06-15 16:32:14

回答

0

这是不完美的,但你可以尝试一个UNION子查询,如:

SELECT ClientVersion, AddressVersion, ModifyDate FROM 
(SELECT ClientVersion, NULL as AddressVersion, ModifyDate FROM Client 
UNION ALL 
SELECT NULL AS ClientVersion, AddressVersion, ModifyDate FROM Address) 
ORDER BY ModifyDate ASC 

应该返回一个结果(来自您的示例数据):

ClientVersion AddressVersion ModifyDate 
CV1        T1 
       AV1    T2 
       AV2    T3 
CV2        T4 
CV3        T5 

然后,您可以在应用程序端的前一行中填写ClientVersion。

0

我相信这会给你想要的东西,尽管它包含了一行开始时有一个CV1但没有AV1。你可以很容易地改变,通过使这些连接INNER JOIN代替:

;WITH Distinct_Dates AS (
    SELECT 
     modified_date 
    FROM 
     Clients 
    UNION 
    SELECT 
     modified_date 
    FROM 
     Addresses 
) 
SELECT 
    C1.client_version, 
    A1.address_version 
FROM 
    Distinct_Dates DD 
LEFT OUTER JOIN Clients C1 ON 
    C1.modified_date <= DD.modified_date AND 
    NOT EXISTS (SELECT * FROM Clients C2 WHERE C2.modified_date > C1.modified_date AND C2.modified_date <= DD.modified_date) 
LEFT OUTER JOIN Addresses A1 ON 
    A1.modified_date <= DD.modified_date AND 
    NOT EXISTS (SELECT * FROM Addresses A2 WHERE A2.modified_date > A1.modified_date AND A2.modified_date <= DD.modified_date) 
0
With 
    ClientTable As 
    (
    Select 'CV1' As Version, 'T1' As ModifiedDate 
    Union All Select 'CV2', 'T4' 
    Union All Select 'CV3', 'T5' 
    ) 
    , AddressTable As 
    (
    Select 'AV1' As Version, 'T2' As ModifiedDate 
    Union All Select 'AV2', 'T3' 
    ) 
    , Ranges As 
    (
    Select C.Version, C.ModifiedDate As StartDate, Min(C2.ModifiedDate) As EndDate 
    From ClientTable As C 
     Left Join ClientTable As C2 
      On C2.ModifiedDate > C.ModifiedDate 
    Group By C.Version, C.ModifiedDate 
    ) 
Select R.Version, Coalesce(A.Version, LastAddressVersion.Version) 
From Ranges As R 
    Left Join AddressTable As A 
     On A.ModifiedDate >= R.StartDate 
      And (A.ModifiedDate < R.EndDate Or R.EndDate Is Null) 
    Cross Join (
       Select A2.Version 
       From AddressTable As A2 
       Where A2.ModifiedDate = (
             Select Max(A3.ModifiedDate) 
             From AddressTable As A3 
             ) 
       ) As LastAddressVersion 
Order By R.Version