Разве SQL A не является левым соединением B, просто A? - PullRequest
0 голосов
/ 27 декабря 2018

Итак, я посмотрел на несколько графиков, чтобы понять разницу между объединениями, и наткнулся на это изображение:

enter image description here

Возможно, проблемав представлении этого с диаграммами Венна.Но, глядя на первое соединение, вверху слева, разве это не просто A?Какая разница, что Б имеет там?

РЕДАКТИРОВАТЬ: https://blog.jooq.org/2016/07/05/say-no-to-venn-diagrams-when-explaining-joins/

Этот сайт хорошо объясняет

Ответы [ 5 ]

0 голосов
/ 27 декабря 2018

На этой диаграмме они опускают слово «внешний» в этом описании, но вы должны прочитать его как LEFT OUTER JOIN.

Таблица слева от оператора SQL (который будеттаблица после FROM, и в этом случае таблица A) будет возвращать каждую строку независимо от того, существует ли соответствующая строка в таблице B, соответствующая условию JOIN.

В этом разница между внутренним соединениеми внешнее соединение.Внутренние объединения возвращают только строку, в которой есть совпадение с условием соединения, тогда как соединение LEFT OUTER возвращает те же строки, которые были возвращены соединением INNER, а также ROW для любых строк в таблице LEFT, которые не удовлетворяютСОЕДИНЕНИЕ состояниеДля тех строк в таблице LEFT, которые не присоединяются к одной или нескольким строкам таблицы B, столбцы таблицы B, которые могут быть указаны в SELECT, будут иметь значение NULL.

Вы можете видеть, что это свойствонесоответствующие строки LEFT, имеющие значения NULL для столбцов таблицы B, используются в приведенном ниже примере, чтобы отфильтровать все строки, полученные в результате успешного объединения с таблицей B.

0 голосов
/ 27 декабря 2018

Ваша диаграмма не совсем диаграмма Венна.

Пересечение двух окружностей представляет соединенные строки (согласно вашему условию соединения) с данными из таблицы A и таблицы B.

Левый полумесяц (помеченный «A») представляет строки в таблице A, которые не имеют соответствующих строк в таблице B;правый полумесяц (помеченный буквой «B») представляет строки в таблице B, которые не имеют соответствующих строк в таблице A.

Предполагается, что верхняя левая диаграмма показывает, что левое соединение дает данные из обоихтаблицы A и B, которые можно объединить в соответствии с вашим условием объединения, а также все строки таблицы A, которые не имеют соответствующего соответствия в таблице B.

0 голосов
/ 27 декабря 2018

A LEFT JOIN B Означает A + (общие записи, которые есть в B) левое соединение, скорее всего, будет выполнено, если в таблице, в которой оставлено соединение, больше записей в этом случае A, и эти записи могут ссылаться на некоторые другие столбцы изВ некоторых общих условиях.следовательно, результат левого соединения B будет означать не только A, но и добавленные столбцы B в случае, если потребуется, для некоторого общего значения A и B.

0 голосов
/ 27 декабря 2018

Нет, это соединение.Если есть несколько строк из B, то строка в A будет отображаться несколько раз.

Пример:

Таблица A:

id name
-- -------
 1 Alice
 2 Malcolm
 3 Kelly

Таблица B:

id_a preferred food
---- --------------
   1 Pizza
   2 Burger
   2 Steak
   2 Menestroni

Тогда «Левое соединение B» даст вам:

id name    id_a preferred food
-- ------- ---- --------------
 1 Alice      1 Pizza
 2 Malcolm    2 Burger
 2 Malcolm    2 Steak
 2 Malcolm    2 Menestroni
 3 Kelly   null null

Короче говоря:

  • Все строки из A отображаются в левом соединении: даже3 Kelly отображается.
  • Столбцы из B будут отображаться с нулевыми значениями, когда в B нет соответствующих строк: строка 3 Kelly имеет null значения в последних двух столбцах.
  • Строки в A могут отображаться несколько раз, когда в B есть несколько совпадений: строка 2 отображается три раза.
0 голосов
/ 27 декабря 2018

При использовании JOIN вы получаете поля из обеих таблиц, а не только из A. Он также умножает количество возвращаемых записей, если отношение между таблицами не равно 1-1.

По сути, единственная разница между всеми этими таблицамиJOIN - это поведение, когда записи в A не соответствуют ни одной записи в B и наоборот.Ваши диаграммы показывают только такое поведение.

Диаграмма top let = хранить все записи из A, независимо от того, соответствуют ли они чему-либо в B (+ что не представлено: когда они совпадают, получить данные из B).

...