Как мне полноценно присоединиться к Mysql? - PullRequest
3 голосов
/ 13 июня 2011

У меня есть две таблицы:
T1
1, а
2, б

T2
2, ггг
3, чч

Я хочу, чтобы соединение между ними дало мне все поля:

1, а, NULL, NULL
2, б, 2, GGG
ноль, ноль, 3, ччч

Ответы [ 2 ]

4 голосов
/ 13 июня 2011

MySQL не имеет FULL OUTER JOIN, но вы можете эмулировать его, например ::100100

SELECT * FROM T1 LEFT OUTER JOIN T2 ON T1.id = T2.id
UNION ALL
SELECT * FROM T1 RIGHT OUTER JOIN T2 ON T1.id = T2.id 
    WHERE T1.id IS NULL;

В целом:

FULL OUTER JOIN = LEFT OUTER JOIN ∪ (RIGHT OUTER JOIN ∖ INNER JOIN)

Вам нужно вырезать одно внутреннее объединение (здесь из правого объединения, но IMHO не имеет значения, какое вы выберете), потому что оба возвращают одно и то же внутреннее объединение. Здесь у вас есть:

T1:

enter image description here

T2: :

enter image description here

ВЛЕВО НАРУЖНОЕ СОЕДИНЕНИЕ: :

enter image description here

ПРАВО НАРУЖНОЕ СОЕДИНЕНИЕ: :

enter image description here

ВНУТРЕННЕЕ СОЕДИНЕНИЕ: :

enter image description here

ПОЛНОЕ НАРУЖНОЕ СОЕДИНЕНИЕ: :

enter image description here

0 голосов
/ 13 июня 2011

Если таблицы имеют (комбинацию) столбцов, которые являются уникальными, вы можете создать список идентификаторов в подзапросе. Затем вы можете использовать два внешних соединения для имитации полного внешнего соединения:

select  *
from    (
        select  col1
        from    t1
        union
        select  col1 
        from    t2
        ) ids
left join
        t1
on      ids.col1 = t1.col1
left join
        t2
on      ids.col1 = t2.col1
...