Какова цель указания условия в «Полное внешнее соединение» в MySQL?

У меня есть следующий запрос «Полное внешнее соединение»:

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
FULL OUTER JOIN Orders
ON Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.CustomerName;

Насколько мне известно, целью «Полного внешнего соединения» в MySQL является возврат всех строк из левой таблицы (Клиенты) и всех строк из правой таблицы (Заказы).

Если в «Заказчиках» есть строки, которым нет совпадений в «Заказах», или если в «Заказах» есть строки, которым нет совпадений в «Клиенты», эти строки также будут перечислены.

Мое сомнение/вопрос заключается в том, что если «Полное внешнее соединение» в MySQL будет возвращать строки из обеих таблиц независимо от соответствующего элемента, то необходимо ли указывать условие в предложении WHERE? Я не могу пропустить это?

Пожалуйста, дайте мне канонический и конкретный ответ относительно RDBMS MySQL.

Спасибо.


person PHPLover    schedule 18.10.2015    source источник
comment
В MySQL нет FULL JOIN и вам не нужно указывать предложение WHERE, хотя априори ничто не мешает вам это сделать.   -  person Tim Biegeleisen    schedule 18.10.2015


Ответы (1)


Когда вы указываете что-то в предложении WHERE, вы должны убедиться, что вы также проверяете значения NULL, например так:

...
WHERE (col1 = 'whatever' OR col1 IS NULL)
AND (col2 = 'other_value' OR col2 IS NULL)
...

Если вы не отметите NULL, ваш FULL OUTER JOIN на самом деле станет INNER JOIN или LEFT/RIGHT JOIN.


Если у вас была опечатка и вы имели в виду «зачем указывать условие в предложении ON?», то ответ таков: без предложения ON ваш JOIN на самом деле является CROSS JOIN, что означает, что каждая строка одной таблицы связана с каждой строкой. с другого стола, что совсем другое дело.


Чтобы сделать этот ответ более специфичным для MySQL, на самом деле в MySQL нет FULL OUTER JOIN, и вы должны эмулировать его с помощью LEFT JOIN ... UNION ... RIGHT JOIN. Но все же применяется тот же принцип.

a left join b using (id)
where b.col1 = 'x'

такой же как

a inner join b using (id)
where b.col1 = 'x'

и вы на самом деле должны написать это как

a left join b on a.id = b.id and b.col1 = 'x'

чтобы действительно иметь левое соединение. Или конечно

a left join b using (id)
where b.col1 = 'x' or b.col1 is null
person fancyPants    schedule 18.10.2015
comment
Мне всегда говорили, что у меня большая голова. Вот это уже ниже пояса ;-) - person Tim Biegeleisen; 18.10.2015
comment
Интересно... поэтому, используя предложение WHERE, вы неявно допускаете нулевую проверку условия. - person Tim Biegeleisen; 18.10.2015
comment
Мое общее ощущение и наблюдение заключается в том, что здесь есть куча нубов, которые даже не тратят 5 минут на поиск в SO или Google, а просто задают здесь вопрос. Так что я пришел к тому, чтобы быть счастливым в отношении заключительных вопросов, но я немного отступлю. Спасибо за ответ. - person Tim Biegeleisen; 18.10.2015