SQL Server:使用MAX(列A),MAX(列B),相关列的DISTINCT选择行

时间:2010-03-12 21:46:50

标签: sql-server tsql union max

情景:

表A
MasterID,添加日期,添加者,更新日期,更新者,
1,1/1/2010,'Fred',null,null
2,1 / 2/2010,'Barney','先生Slate',2010年7月7日
3,1/3/2010,'Noname',null,null

表B
MasterID,添加日期,添加者,更新日期,更新者,
1,1/3/2010,'Wilma','The Great Kazoo',2010年1月5日
2,1/4/2010,'Betty','Dino',2010年1月4日
表C
MasterID,添加日期,添加者,更新日期,更新者,
1,1/5/2010,'Pebbles',null,null
2,2010年6月1日,'BamBam',null,null

表D
MasterID,添加日期,添加者,更新日期,更新者,
1,1 / 2/2010,'Noname',null,null
3,1/4/2010,'Wilma',null,null

当表A,B,C和D是UNION时,我需要返回最大添加日期和相应的用户,以及每个不同记录的最大更新日期和相应的用户,即:
1,1/5/2010,'Pebbles','The Great Kazoo',2010年1月5日
2,2010年6月1日,'BamBam','先生Slate',2010年7月7日
3,1/4/2010,'Wilma',null,null

我知道如何使用每行一个日期/用户,但有两个超出我 DBMS是SQL Server 2005.首选T-SQL解决方案
提前谢谢,
戴夫

1 个答案:

答案 0 :(得分:0)

按照每行一个日期/用户的操作,重复修改日期,然后在MasterID上将两个结果表连接在一起。

SELECT added.MasterID, added.AddedDate, added.AddedBy, modif.UpdatedDate, modif.UpdatedBy FROM
(
SELECT a.MasterID, a.AddedDate, b.AddedBy FROM
(
    SELECT MasterID, Max(AddedDate) As AddedDate FROM
    (
        SELECT * FROM TableA
        UNION ALL
        SELECT * FROM TableB
        UNION ALL
        SELECT * FROM TableC
        UNION ALL
        SELECT * FROM TableD
    )
    GROUP BY MasterID
) a
JOIN
(
        SELECT * FROM TableA
        UNION ALL
        SELECT * FROM TableB
        UNION ALL
        SELECT * FROM TableC
        UNION ALL
        SELECT * FROM TableD
) b
ON a.MasterID = b.MasterID AND a.AddedDate = b.AddedDate
) added
LEFT OUTER JOIN
(
SELECT a.MasterID, a.UpdatedDate, b.UpdatedBy FROM
(
    SELECT MasterID, Max(UpdatedDate) As UpdatedDate FROM
    (
        SELECT * FROM TableA
        UNION ALL
        SELECT * FROM TableB
        UNION ALL
        SELECT * FROM TableC
        UNION ALL
        SELECT * FROM TableD
    )
    GROUP BY MasterID
) a
JOIN
(
        SELECT * FROM TableA
        UNION ALL
        SELECT * FROM TableB
        UNION ALL
        SELECT * FROM TableC
        UNION ALL
        SELECT * FROM TableD
) b
ON a.MasterID = b.MasterID AND a.UpdatedDate = b.UpdatedDate
) modif
ON added.MasterID = modif.MasterID