J'ai deux tables:. tableA (ID [int, pk], Name [string])
et TableB(ID [int, pk], TableA_ID [int, fk], Name [string], DateStamp [datetime (dd/mm/yyyy hh:MM:ss)])
Il y a un à plusieurs entre TableA et TableBest-ce un candidat pour une requête sql groupby?
Une jointure interne sur les deux tableaux me donner les résultats suivants.:
TableA.ID, TableA.Name, TableB.Name, TableB.DateStamp 1, 'File A', 'Version 1', 01/01/2009 15:00:00 1, 'File A', 'Version 2', 05/01/2009 08:15:00 1, 'File A', 'Version 3', 06/01/2009 19:33:00 2, 'File B', 'Version 1', 03/01/2009 09:10:00 2, 'File B', 'Version 2', 20/01/2009 20:00:00 3, 'File C', 'Version 1', 01/01/2009 17:00:00
Ce que je veux en fait est la suivante (chaque ligne de TableA et la dernière ligne correspondante de TableB):
TableA.ID, TableA.Name, TableB.Name, TableB.DateStamp 1, 'File A', 'Version 3', 06/01/2009 19:33:00 2, 'File B', 'Version 2', 20/01/2009 20:00:00 3, 'File C', 'Version 1', 01/01/2009 17:00:00
Ceci est la requête que j'utilise pour y parvenir:
SELECT ta.ID, ta.Name, tb.Name, tb.DateStamp
FROM TableA ta INNER JOIN TableB tb ON ta.ID = tb.TableA_ID
WHERE tb.ID IN (
SELECT TOP 1 tb2.ID
FROM TableB tb2
WHERE tb2.TableA_ID = ta.ID
ORDER BY tb2.DateStamp DESC)
Cela fonctionne, mais mon sentiment est que je ne fais pas ça dans la « meilleure façon ». Il semble que ce soit un candidat pour une requête d'agrégation (c'est-à-dire groupby) mais je n'ai pas eu de chance avec cela. À la fin j'ai toujours dû utiliser une sous-requête pour obtenir la rangée que je suis après dans la TableB.
Toute aide très appréciée.
Je regardais le groupe de haut niveau par l'utilisation dans cette situation, et est arrivé à des conclusions similaires à la vôtre. – kristof
Je suggérerais d'utiliser TableB.TableB_ID dans la première requête si possible (c'est-à-dire s'il a le même ordre que DateStamp), car la comparaison d'entier est toujours plus rapide que la comparaison de date. –
Oui, mais je ne peux pas insinuer silencieusement un TableB.TableB_ID qui est strictement monotone. – Tomalak