Является ли следующее предложение о присоединении действительным? - PullRequest
0 голосов
/ 06 сентября 2011

Допустимо ли это объединение в MySQL:

FROM a
JOIN b on a.c = b.c and b.c = 1

Ну, это работает так, но когда я использую ПРАВОЕ СОЕДИНЕНИЕ, b.c = 1 игнорируется. Почему это?

Ответы [ 4 ]

2 голосов
/ 06 сентября 2011

Не игнорируется в RIGHT JOIN.

(Концептуально) Соединение происходит с примененным фильтром, после чего все несоответствующие строки из b добавляются обратно.

Таким образом, запрос

SELECT a.c, b.c
FROM   (select 1 AS c
        UNION ALL
        SELECT 2) a
       RIGHT JOIN (select 1 AS c
                   UNION ALL
                   select 2 AS c) b
         on a.c = b.c
            and b.c = 1  

Возвращает

c           c
----------- -----------
1           1
NULL        2

Вы можете видеть, что, несмотря на то, что обе таблицы имеют 2, дополнительный фильтр в предложении join означает, что эти строки не объединяются.Однако, поскольку это right outer объединение строки 2 из правой таблицы (b), все еще появляется в результатах.

Редактировать: RE: Вопрос в комментариях

Тогда как мне LEFT JOIN без добавления отфильтрованных строк обратно?Если вместо этого я использую предложение WHERE, объединение будет медленнее, потому что потребуется объединить больше строк, верно?

Я не совсем понимаю этот вопрос.

Вы бы выбрали LEFT против RIGHT объединения на основе того, хотите ли вы сохранить все строки с левого или правого ввода.Для простого запроса к двум таблицам вы, конечно, можете использовать любой из них и просто изменить порядок таблиц в обратном порядке.

Аналогично для вопроса о том, следует ли помещать фильтр в условие WHERE или условие JOINOUTER JOIN это может изменить результаты (в моем примере перемещение данных b.c = 1 в предложение WHERE означает, что будет возвращена только 1 строка, а не 2)

Для случая INNER JOIN этоне имеет значения, где расположены фильтры, но я считаю более целесообразным размещать фильтры, касающиеся взаимосвязи между двумя таблицами в JOIN и всеми другими в WHERE

1 голос
/ 06 сентября 2011

Да, это действительно.

Однако, когда вы используете правильное соединение, вы фактически получите все значения в «правильной» таблице, которые не удовлетворяют условию соединения, в дополнение к тем, кто это делает. Вот что делает правильное соединение

Используйте предложение where, чтобы ограничить то, что вы извлекаете из таблицы b в этом случае.

ОТ ПРАВИЛЬНОЕ СОЕДИНЕНИЕ b на a.c = b.c ГДЕ b.c = 1

1 голос
/ 06 сентября 2011

Да. Это нормально, если в предложении on есть дополнительные условия, которые не имеют ничего общего с другими таблицами

0 голосов
/ 06 сентября 2011

Почему бы не написать это так, чтобы было понятнее:

FROM a
JOIN b on a.c = b.c
WHERE b.c = 1
...