2010-08-02 8 views
1

Tableau 1sélectionner une ligne distincte dans jointure gauche

ID 
1 
2 
3 

Tableau 2

ID date opt 
1 1/1/10 1 
1 1/2/10 0 
2 1/1/10 1 

Je veux

ID date opt 
1 1/2/10 0 
2 1/1/10 1 

Comment puis-je joindre ces 2 tables? Juste correspondre à tous les ID dans le tableau 1 avec leur opt plus récent dans le tableau 2. Sans partitions, s'il vous plaît. Je suis en sql 2005. Merci.

+0

Désolé, problème formatage, voici mes tableaux: tableau 1 id tableau 2 date ID opt 1 1/1/10 1 1 1/2/10 0 2 1/1/10 1 Je veux ID date opt 1 1/2/10 0 2 1/1/10 1 – NetWriter

Répondre

2
Select ID, date, opt 
From Table2 As T2 
Where date = (
      Select Max(date) 
      From Table2 As T3 
      Where T3.ID = T.ID 
      ) 
+0

Merci pour les réponses. – NetWriter

0
select t1.ID, t2.date, t2.opt 
from (
    select ID, max(date) as MaxDate 
    from Table2 
    group by ID 
) t2m 
inner join Table2 t2 on t2m.ID = t2.ID and t2.MaxDate = t2.date 
inner join Table1 t1 on t2.ID = t1.ID 
1

Voici la solution sans sous-requêtes:

SELECT t1.ID, t2.date, t2.opt 
FROM Table1 t1 
LEFT JOIN Table2 t2 
    ON t2.ID = t1.ID 
LEFT JOIN Table2 t3 
    ON t3.ID = t1.ID AND t3.date > t2.date 
WHERE t3.date IS NULL 

Vous pouvez obtenir des doublons si vous avez deux entrées dans le tableau 2 avec la même date "dernier" et ID. Toutefois, vous pouvez ajouter des conditions supplémentaires pour gérer deux entrées ayant la même date "latest". En outre, vous obtiendrez des valeurs NULL pour la date et opterez s'il n'y a aucun enregistrement correspondant dans le tableau 2.

Il y a un chapitre entier sur ce type de solution dans le livre SQL Antipatterns.

Questions connexes