2016-01-18 3 views
2

voulez juste afficher toutes les données dans le tableau A et LEFT JOIN Table B avec sous-requête coorelate mais ne parviennent pas à obtenir toutes les données dans le tableau APourquoi LEFT OUTER JOIN réduit les lignes de la table de gauche?

SELECT a.id FROM tableA a 
LEFT JOIN tableB b1 ON a.id = b1.id 
WHERE date = (SELECT MAX(date) FROM tableB b2 WHERE b1.id= b2.id) 
 
tableA 

id 
====== 
1001 
1002 
1003 
1004 

tableB 

id date 
============= 
1001 20160101 
1001 20160102 
1003 20160102 
1003 20160105 

Expected Result 

id date 
=============== 
1001 20160102 
1002 NULL 
1003 20160105 
1004 NULL 

Engine Return 

id date 
============= 
1001 20160102 
1003 20160105 

Répondre

3

Ce que je ferais est une jointure gauche sur un sous-select, qui contient seulement la date maxi par id comme ceci:

SELECT a.id, b.maxdate FROM tableA a 
LEFT JOIN (SELECT id, MAX(date) AS 'maxdate' FROM tableB2 GROUP BY id) b ON a.id = b.id 

Cela devrait aussi être plus rapide, puisque le select de la jointure ne sera exécuté qu'une seule fois alors que select dans une clause where sera exécutée pour chaque ligne.

+0

Merci, ça marche parfaitement! – Fireghost

0

mise à jour de votre requête à:

SELECT a.id, b1.date FROM tableA a 
LEFT outer JOIN tableB b1 ON a.id = b1.id 
WHERE date = (SELECT MAX(date) FROM tableB b2 WHERE b1.id= b2.id) or date is null 
+0

changement « Où » pour « ET », et de perdre la « ou la date est nulle » bit - ou tout simplement aller avec la meilleure réponse ci-dessus. – Strawberry

0

La clause where s'applique à l'ensemble de données joint. Votre condition where supprime donc ces enregistrements du jeu de résultats qui ne correspondent pas aux critères.

Je propose votre sous-requête à la clause de:

SELECT a.id FROM tableA a 
LEFT JOIN (SELECT MAX(date) as mdate, id FROM tableB GROUP BY id) b1 ON a.id = b1.id 
+0

Je pense que votre sous-select renverra la MAX (date) de la table entière pour chaque ligne, si elle n'est pas groupée par id, sinon c'est la même solution que la mienne ;-) – Fuzzzzel

+0

Merci, raté celui-là. – Shadow

+0

Ce n'est toujours pas correct, mais vu que Fuzzzzel l'a cloué, un DELETE suffira probablement. – Strawberry