Использование Two LEFT JOIN или использование AND с одним LEFT JOIN?


7

Используя два LEFT JOINс то есть

SELECT <some columns>
FROM Table1 AS t1
LEFT JOIN Table2 AS t2 ON <condition1>
LEFT JOIN Table2 AS t3 ON <condition2>

это то же самое, что использовать ANDв сингле LEFT JOIN? т.е.

SELECT <some columns>
FROM Table1 AS t1
LEFT JOIN Table2 AS t2 ON <condition1>
AND <condition2>

Оба одинаковые или разные (в общем)?


Это зависит от ваших требований и условий. Если вы установите t1.col1 = t2.col1 с таблицей 2 и t1.col1.t3.col1, это будет то же самое.

2
Второй запрос был бы ближе к первому с точки зрения результатов, если бы он использовал ИЛИ вместо И, но в целом это был бы другой запрос .
Андрей М

Попробуйте использовать план объяснения, чтобы увидеть разницу :)
Арнаб Датта

@RajeshRanjan нет, они не будут эквивалентны, даже в этом случае.
ypercubeᵀᴹ

Ответы:


13

Они разные. В первом варианте вы получаете 2 раза Table2в свой запрос. Однажды как t2и однажды как t3. Оба имеют разный контент, и вы должны как-то собрать их вместе. Для меня это скорее OR вместо AND . Во втором варианте вы получаете только те Table2строки, которые соответствуют обоим критериям.

Предположим, у вас есть Table2следующее содержание:

| Color | Size |
|-------|------|
| Red   |  S   |
| Blue  |  S   |
| Blue  |  XS  |

Предположим, вы хотите иметь строки, которые Blueи S. В первом варианте вы получаете все строки ( t2например, со всеми Blueи t3со всеми S), а во втором варианте вы получаете только строку 2.


4
Не только это, но поскольку речь идет о внешнем присоединении к таблице дважды, вы также получите мини-декартово произведение с первым запросом. Я имею в виду, что Table1строке нужен синий цвет и размер S. Итак, первое объединение дает ему два Table2совпадения, дублируя Table1строку, а второе объединение дает два совпадения для каждой из копий, в результате чего получается всего четыре строки.
Андрей М
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.