2010-03-12 17 views
0

Scénario:SQL Server: SELECT lignes avec MAX (colonne A), MAX (colonne B), DISTINCT par des colonnes liées

Tableau A
MASTERID, Ajouté Date, Ajouté par, mise à jour Date, Mis à jour par,
1, 1/1/2010, 'Fred', null, null
2, 1/2/2010, 'Barney', 'M. Slate », 1/7/2010
3, 1/3/2010, 'Noname', null, null

Tableau B
MASTERID, Ajouté Date, Ajouté par, mise à jour Date, Mis à jour par,
1 , 1/3/2010, 'Wilma', 'Le Grand Kazoo', 1/5/2010
2, 1/4/2010, 'Betty', 'Dino', 1/4/2010

Tableau C
MasterID, Date d'ajout, Ajouté par, Date de mise à jour, Mis à jour par,
1, 1/5/2010, 'Cailloux', null, null
2, 1/6/2010, 'BamBam', null, null

Tableau D
MASTERID, Date ajoutée, ajoutée par, actualisée Date, actualisée By,
1, 02.01.2010, 'Noname', null, null
3, 1/4/2010, 'Wilma', null, null

Je dois retourner la date d'ajout maximale et l'utilisateur correspondant, et la date mise à jour maximale et l'utilisateur correspondant pour chaque enregistrement distinct lorsque les tables A, B, C & D sont UNION, à savoir:
1, 1/5/2010, 'Cailloux', 'Le Grand Kazoo', 1/5/2010
2, 1/6/2010, 'BamBam ', 'M. Slate », 1/7/2010
3, 1/4/2010, 'Wilma', null, null

Je sais comment faire avec une date/utilisateur par ligne, mais avec deux est au-delà de moi. Le SGBD est SQL Server 2005. Solution T-SQL préférée.

Merci à l'avance,
Dave

Répondre

0

Est-ce que vous le feriez avec une date/utilisateur par ligne, et répétez l'opération pour la date de modification, puis joindre les deux tables formant ensemble sur le 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 
+0

Merci Nate !! Pour SQL Server, j'ai dû spécifier un nom de table dérivé pour les SELECTs internes. Dave SELECT added.MasterID, added.AddedDate, added.AddedBy, modif.UpdatedDate, modif.UpdatedBy DE ( SELECT a.MasterID, a.AddedDate, à partir de b.AddedBy ( SELECT MASTERID, Max (AddedDate) comme AddedDate dE ( SELECT * FROM TableA UNION ALL SELECT * FROM TableB UNION ALL SELECT * FROM TableC UNION ALL SELECT * FROM déposé) a1 - (ajouté ce) GROUP BY MASTERID ) un ... – Dave