2010-06-15 7 views
0

Я пытаюсь реализовать управление версиями данныхЗапрос SQL Server 2008

У меня есть две таблицы Клиент и адрес. Я должен отображаться в интерфейсе, различные обновления в том порядке, в котором они были сделаны, но с правильной версией клиента

так,

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

Существуют версии и даты все в одной таблице в виде двух столбцов или в виде четырех столбцов в одной строке? Было бы проще помочь вам, если бы вы включили определения таблиц, выборочные данные и ожидаемый результат. –

ответ

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