2010-11-19 15 views
2

Ich muss links Join zu ganzen t2 + t3-Zweig, aber wenn ich einen passenden Join zwischen t1 und t2 finden kann, möchte ich die t2 und t3 Join erzwingen.Wie erzwinge ich die Verbindung in einem linken Join-Zweig?

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 

Wie lautet die Syntax?

Beispieldaten:

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' 

Erwartetes Ergebnis:

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

So wollen Sie Reihen auszuschließen, in denen [a] nicht NULL ist und [Bob] Ist NULL? –

+0

@Lynette Duffy - nein .... Es ist etwas, was wie eine AND-Aussage ist. entweder bekomme ich [A] AND [bob] oder ich bekomme keine (null, null). Ich will nicht [a] ohne [bob] und umgekehrt. –

Antwort

4

EDIT: Diese Abfrage liefert das Ergebnis als von Ihren Beispieldaten erwartet - (Beachten Sie auch, wird diese Abfrage gemacht mit Hilfe von Treefrogs Antwort unten) -

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 

Meine ältere Antwort -

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

Sorry, aber nein, dies erzwingt die Verknüpfung von t2 und t3 nur dann, wenn beide Daten in ihnen haben. –

+1

Einige Leute vergessen, wir sind nicht telepathisch :( –

+0

@Italy Maov - Bearbeitete meine Antwort. Auch ich versuche, Ihnen hier zu helfen. Sie müssen mich nicht abmelden. Wenn Sie sich falsch fühlen, dann können Sie mich wissen lassen. Will versuchen Sie es zu korrigieren oder löschen Sie es, wenn es nicht hilft –

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

Beide werden Sie Ihr Ergebnis. Nicht sicher, was besser wäre.

VERSCHACHTELTE STATEMENT:

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 

TEMPORARY TABLE:

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

Dies sollte in MySQL arbeiten

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