Cela vous donnera presque toujours de meilleures performances que la méthode de sous-requête. Vous êtes à la recherche essentiellement pour la ligne qui n'a pas d'autres lignes passées plutôt que de chercher la ligne avec la plus grande date:
SELECT
P.ProjectID,
P.ProjectName,
T.ThingID,
T.ThingName
FROM
dbo.Projects P
INNER JOIN dbo.ProjectThingLinks PTL1 ON
PTL1.ProjectID = P.ProjectID
LEFT OUTER JOIN dbo.ProjectThingLinks PTL2 ON
PTL2.ProjectID = ThingID = PTL1.ThingID AND
PTL2.CreatedDate > PTL1.CreatedDate
INNER JOIN dbo.Things T ON
T.ThingID = PTL1.ThingID
WHERE
PTL2.ThingID IS NULL
Une fois que vous décidez de vos règles métier pour gérer deux lignes qui ont identiques CreatedDate valeurs que vous pourriez avoir besoin de modifier la requête.
En outre, en note, une table appelée "Things" est généralement un bon signe d'un problème avec la conception de votre base de données. Les tableaux doivent représenter des entités de la vie réelle distinctes. Ce genre de généralité entraînera généralement des problèmes dans le futur. Si ce sont des ressources, ils partageront probablement certains attributs au-delà d'un simple nom. Peut-être que votre cas est un cas très particulier, mais très probablement pas. ;)
Je pense qu'il y a un problème avec cette requête. Ne montrera-t-il pas toujours toutes les tâches assignées à un projet même si elles ont été réaffectées? Vous devez supprimer le l2.projectid = l.projectid je pense. –
Merci, je l'ai corrigé maintenant. –