2011-08-25 2 views
12
SELECT * FROM A 
JOIN B 
ON B.ID = A.ID 
AND B.Time = (SELECT max(Time) 
          FROM B B2 
          WHERE B2.ID = B.ID) 

J'essaie de joindre ces deux tables dans MYSQL. Ne faites pas attention à cela si l'ID est unique alors je ne voudrais pas essayer de le faire. J'ai condensé la vraie solution pour peindre une image simplifiée. J'essaie de saisir et de joindre la table B à la date maximale pour un certain enregistrement. Cette procédure est exécutée par un package SSIS et indique B2.ID est une colonne inconnue. Je fais souvent ce genre de choses dans MSSQL et je suis nouveau dans MYSQL. Quelqu'un at-il des pointeurs ou des idées?Instruction imbriquée dans la jointure MYSQL

Répondre

27

Je fais ce type de requête différemment, avec une jointure d'exclusion au lieu d'une sous-requête. Vous voulez trouver les lignes de B qui ont le temps maximum pour un ID donné; en d'autres termes, où aucune autre rangée n'a un plus grand temps et le même ID.

SELECT A.*, B.* 
FROM A JOIN B ON B.ID = A.ID 
LEFT OUTER JOIN B AS B2 ON B.ID = B2.ID AND B.Time < B2.Time 
WHERE B2.ID IS NULL 

Vous pouvez également utiliser une table dérivée, ce qui devrait faire mieux que l'utilisation d'une sous-requête corrélée.

SELECT A.*, B.* 
FROM A JOIN B ON B.ID = A.ID 
JOIN (SELECT ID, MAX(Time) AS Time FROM B GROUP BY ID) AS B2 
    ON (B.ID, B.Time) = (B2.ID, B2.Time) 

P.S .: J'ai ajouté la balise greatest-n-per-group. Ce type de question SQL arrive chaque semaine sur Stack Overflow, vous pouvez donc suivre cette balise pour voir des dizaines de questions similaires et leurs réponses.

+2

Bonne réponse! +1 – shesek

+0

Bien mis merci beaucoup – JBone