2010-11-19 18 views
2

J'ai besoin de GAUCHER joindre à la branche entière t2 + t3, mais si je peux trouver une jointure entre t1 et t2, je veux appliquer la jointure t2 et t3.Comment forcer la jointure à l'intérieur d'une branche de jointure à gauche?

SELECT T1.name,T2.bob,T3.a 
    FROM T1 
LEFT JOIN T2 ON t1.id = t2.t1_id 
    JOIN T3 ON t2.id = T3.t2_id 

Quelle est la syntaxe?

données Exemple:

T1 [id,name] 
1 aaa 
2 bbb 
3 ccc 

T2 [id,t1_id,bob] 
1,1,777 
2,1,888 
2,2,999 

T3[id,t2_id,a] 
1,2,'yeh' 

RÉSULTAT PRÉVU:

[name] , [a] , [bob] 
    aaa , 'yeh' , 888 
    bbb , NULL , NULL 
    ccc , NULL , NULL 
+0

Alors voulez-vous exclure les lignes où est-ce pas NULL [a] et [bob] est NULL? –

+0

@Lynette Duffy - non .... C'est un peu comme une déclaration AND. soit je reçois [A] ET [bob] ou je n'en obtiens aucun (nul, nul). Je ne veux pas avoir [a] sans [bob] et vice versa. –

Répondre

4

EDIT: Cette requête vous renvoie le résultat comme prévu à partir de vos données d'échantillon - (Notez également, cette requête est prise avec l'aide de la réponse de Treefrog ci-dessous) -

SELECT t1.[name], t3.a, t2.bob 
FROM T2 as t2 
JOIN T3 as t3 ON t3.t2_id = t2.id 
RIGHT JOIN T1 as t1 ON t1.id = t2.t1_id 

Ma grande réponse -

SELECT a 
FROM T1 as t1 
INNER JOIN T2 as t2 ON t1.id = t2.t1_id 
LEFT JOIN T3 as t3 ON t2.id = t3.t2_id 
+0

désolé, mais non, cela ne fera pas appliquer la jointure de t2 et t3 pour être seulement lorsque les deux ont des données en eux. –

+1

Certaines personnes oublient que nous ne sommes pas télépathes :( –

+0

@Italy Maov - Edited ma réponse.Egalement j'essaie de vous aider ici.Vous ne devez pas me downvote.Si vous vous sentez tort, alors vous pouvez me le faire savoir. essayer de le corriger ou de le supprimer si cela ne aide pas –

2
SELECT T1.a 
FROM T2 
JOIN T3 ON T3.t2_id = T2.id 
RIGHT JOIN T1 ON T1.id = T2.t1_id 
0

Ces deux vous donnera votre résultat. Je ne sais pas qui serait le meilleur.

DÉCLARATION IMBRIQUEES:

SELECT [name], NULL AS [a], NULL AS [bob] 
FROM t1 
LEFT OUTER JOIN t2 ON t1.id = t2.t1_id 
LEFT OUTER JOIN t3 ON t2.id = t3.t2_id 
WHERE t3.t2_id IS NULL 
AND (SELECT COUNT(*) FROM t1 AS t1b LEFT OUTER JOIN t2 AS t2b ON t1b.id = t2b.t1_id LEFT OUTER JOIN t3 AS t3b ON t2b.id = t3b.t2_id WHERE t1.id = t1b.id AND t3b.a IS NOT NULL) = 0 
UNION 
SELECT [name], [a], [bob] 
FROM t1 
LEFT OUTER JOIN t2 ON t1.id = t2.t1_id 
LEFT OUTER JOIN t3 ON t2.id = t3.t2_id 
WHERE t3.t2_id IS NOT NULL 
ORDER BY t1.name 

TABLEAU TEMPORAIRE:

CREATE TABLE #tmp_Rslt([name] varchar(50), [a] varchar(50), [bob] varchar(50)) 

--select matches 
INSERT INTO #tmp_Rslt 
SELECT [name], [a], [bob] 
FROM t1 
LEFT OUTER JOIN t2 ON t1.id = t2.t1_id 
LEFT OUTER JOIN t3 ON t2.id = t3.t2_id 
WHERE t3.t2_id IS NOT NULL 
ORDER BY t1.name 

--select t1's that didn't have matches 
INSERT INTO #tmp_Rslt 
SELECT [name], NULL AS [a], NULL AS [bob] 
FROM t1 
LEFT OUTER JOIN t2 ON t1.id = t2.t1_id 
LEFT OUTER JOIN t3 ON t2.id = t3.t2_id 
WHERE t3.t2_id IS NULL 
AND t1.[name] NOT IN (SELECT DISTINCT [name] FROM #tmp_Rslt) 

SELECT * 
FROM #tmp_Rslt 

--cleanup. 
DROP TABLE #tmp_Rslt 
0

Cela devrait fonctionner dans MySQL

SELECT * FROM T1 
LEFT JOIN (T2 
INNER JOIN T3 ON T2.id=T3.t2_id 
) ON T1.id= T2.t1_id