2015-10-18 4 views
1

Я следующий запрос из «полного внешнего соединения»:Какова цель задания условия в «Полная внешняя связь» в MySQL?

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

По моим сведениям Цель «Full Outer Join» в MySQL должен вернуть все строки из левой таблицы (Клиенты) и все строки из правой таблицы (Заказы).

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

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

Пожалуйста, дайте мне канонический и ответ на вопрос относительно MySQL РСУБД.

Спасибо.

+1

В MySQL нет 'FULL JOIN', и вам не нужно указывать предложение' WHERE', хотя нет ничего априори, чтобы вы этого не делали. –

ответ

3

При указании что-то в предложении 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 
+0

Мне всегда говорили, что у меня большая голова. Теперь это бьет ниже пояса ;-) –

+0

Интересно ... поэтому, используя предложение WHERE, вы неявно допускаете нулевую проверку в этом состоянии. –

+0

Мое общее чувство и наблюдение заключается в том, что здесь есть масса нубов, которые даже не тратят 5 минут на поиск SO или Google и просто сбрасывают вопрос здесь. Таким образом, я пришел к выводу, что мы готовы к закрытию вопросов, но я немного отдержусь. Спасибо за ответ. –