Двунаправленное внешнее соединение - PullRequest
8 голосов
/ 13 августа 2008

Предположим, у нас есть таблица A:

itemid mark
1      5
2      3

и таблица B:

itemid mark
1      3
3      5

Я хочу присоединиться к A * B на A.itemid = B.itemid, как правой, так и левой дорогой то есть результат:

itemid A.mark B.mark
1      5      3
2      3      NULL
3      NULL   5

Есть ли способ сделать это одним запросом в MySQL?

Ответы [ 3 ]

7 голосов
/ 13 августа 2008

Это называется полным внешним объединением и изначально не поддерживается в MySQL, судя по его документам . Вы можете обойти это ограничение, используя UNION, как описано в комментариях к странице, на которую я ссылался.

[править] Так как другие опубликовали отрывки, вот, пожалуйста. Вы можете увидеть объяснение на связанной странице.

SELECT *
FROM A LEFT JOIN B ON A.id = B.id
UNION ALL
SELECT *
FROM A RIGHT JOIN B ON A.id = B.id
WHERE A.id IS NULL
2 голосов
/ 13 августа 2008

Можно сделать с какой-то работой, но вот некоторые sql

select distinct T.itemid, A.mark as "A.mark", B.mark as "B.mark"
    from (select * from A union select * from B) T 
    left join A on T.itemid = A.itemid 
    left join B on T.itemid = B.itemid;

Это основывается на левом соединении, которое возвращает все строки в исходной таблице (в данном случае это таблица подвыборов T). Если в объединенной таблице нет совпадений, для столбца будет установлено значение NULL.

0 голосов
/ 13 августа 2008

Это работает для меня на SQL Server:

select isnull(a.id, b.id), a.mark, b.mark
from a 
full outer join b on b.id = a.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...