2010-11-19 3 views
2

Мне нужно ЛЕВОЕ присоединиться к целой ветви t2 + t3, но если я найду подходящее соединение между t1 и t2, я хочу, чтобы принудительное соединение t2 и t3.Как принудительно присоединиться к левой ветви соединения?

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 

Что такое синтаксис?

Образец данных:

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' 

ОЖИДАЕМЫЕ РЕЗУЛЬТАТЫ:

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

Так что вы хотите, чтобы исключить строки, где [а] не NULL и [bob] NULL? –

+0

@ Lynette Duffy - нет. Это какой-то, как заявление AND. либо я получаю [A] AND [bob], либо я не получаю ни одного (null, null). Не хотите получать [a] без [bob] и наоборот. –

ответ

4

EDIT: Этот запрос возвращает вам результат, как ожидалось от ваших данных выборки - (Также отметим, этот запрос принимается с помощью ответа Treefrog ниже) -

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 

Моего Пожилого ответа -

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

извините, но нет, это не приведет к принудительному объединению t2 и t3 только в том случае, если оба имеют в них данные. –

+1

Некоторые люди забывают, что мы не телепаты :( –

+0

@ Италия Маов - Отредактировал свой ответ. Также я пытаюсь помочь вам здесь. Вам не нужно меня преследовать. Если вы чувствуете себя не так, тогда вы можете сообщить мне. попробуйте исправить его или удалить его, если это не поможет. –

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

Оба они дадут вам результат. Не уверен, что будет лучше.

NESTED ЗАЯВЛЕНИЕ:

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 

ВРЕМЕННОЕ ТАБЛИЦА:

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

Это должно работать в MySQL

SELECT * FROM T1 
LEFT JOIN (T2 
INNER JOIN T3 ON T2.id=T3.t2_id 
) ON T1.id= T2.t1_id 
Смежные вопросы