Использование 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>

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

0x6773
источник
Это зависит от ваших требований и условий. Если вы установите 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.

Marco
источник
4
Не только это, но поскольку речь идет о внешнем присоединении к таблице дважды, вы также получите мини-декартово произведение с первым запросом. Я имею в виду, что Table1строке нужен синий цвет и размер S. Итак, первое объединение дает ему два Table2совпадения, дублируя Table1строку, а второе объединение дает два совпадения для каждой из копий, в результате чего получается всего четыре строки.
Андрей М