В чем разница между an INNER JOIN
и LEFT SEMI JOIN
?
Почему в приведенном ниже сценарии я получаю два разных результата?
Набор INNER JOIN
результатов намного больше. Кто-нибудь может объяснить? Я пытаюсь получить имена внутри, table_1
которые появляются только в table_2
.
SELECT name
FROM table_1 a
INNER JOIN table_2 b ON a.name=b.name
SELECT name
FROM table_1 a
LEFT SEMI JOIN table_2 b ON (a.name=b.name)
left semi join
Должен возвращаться больше строк , чемinner join
.inner join
вернет данные только в том случае, если обе таблицы совпадают. Функцияleft join
вернет данные из первой таблицы независимо от того, найдена ли соответствующая запись во второй таблице.LEFT SEMI JOIN
вернет только одну строку слева, даже если справа есть несколько совпадений.INNER JOIN
Будет возвращать несколько строк , если есть несколько согласования справа.Ответы:
INNER JOIN
Может возвращать данные из столбцов из обеих таблиц, и может дублировать значения записей по обе стороны имеют более чем один матч. ALEFT SEMI JOIN
может возвращать только столбцы из левой таблицы и дает по одной каждой записи из левой таблицы, где есть одно или несколько совпадений в правой таблице (независимо от количества совпадений). Это эквивалентно (в стандартном SQL):SELECT name FROM table_1 a WHERE EXISTS( SELECT * FROM table_2 b WHERE (a.name=b.name))
Если в правом столбце есть несколько совпадающих строк, объект
INNER JOIN
возвращает одну строку для каждого совпадения в правой таблице, аLEFT SEMI JOIN
возвращает только строки из левой таблицы, независимо от количества совпадающих строк в правой части. Вот почему вы видите другое количество строк в своем результате.Тогда
LEFT SEMI JOIN
подходящий запрос для использования.источник
LEFT SEMI JOIN
? Разве это не простоSEMI JOIN
? В этом нет никакого смыслаRIGHT SEMI JOIN
, не так ли?Предположим, есть 2 таблицы TableA и TableB только с 2 столбцами (Id, Data) и следующими данными:
Таблица А:
+----+---------+ | Id | Data | +----+---------+ | 1 | DataA11 | | 1 | DataA12 | | 1 | DataA13 | | 2 | DataA21 | | 3 | DataA31 | +----+---------+
ТаблицаB:
+----+---------+ | Id | Data | +----+---------+ | 1 | DataB11 | | 2 | DataB21 | | 2 | DataB22 | | 2 | DataB23 | | 4 | DataB41 | +----+---------+
Внутреннее соединение по столбцу
Id
вернет столбцы из обеих таблиц и только соответствующие записи:.----.---------.----.---------. | Id | Data | Id | Data | :----+---------+----+---------: | 1 | DataA11 | 1 | DataB11 | :----+---------+----+---------: | 1 | DataA12 | 1 | DataB11 | :----+---------+----+---------: | 1 | DataA13 | 1 | DataB11 | :----+---------+----+---------: | 2 | DataA21 | 2 | DataB21 | :----+---------+----+---------: | 2 | DataA21 | 2 | DataB22 | :----+---------+----+---------: | 2 | DataA21 | 2 | DataB23 | '----'---------'----'---------'
Левое соединение (или левое внешнее соединение) в столбце
Id
вернет столбцы из обеих таблиц и соответствующие записи с записями из левой таблицы (нулевые значения из правой таблицы):.----.---------.----.---------. | Id | Data | Id | Data | :----+---------+----+---------: | 1 | DataA11 | 1 | DataB11 | :----+---------+----+---------: | 1 | DataA12 | 1 | DataB11 | :----+---------+----+---------: | 1 | DataA13 | 1 | DataB11 | :----+---------+----+---------: | 2 | DataA21 | 2 | DataB21 | :----+---------+----+---------: | 2 | DataA21 | 2 | DataB22 | :----+---------+----+---------: | 2 | DataA21 | 2 | DataB23 | :----+---------+----+---------: | 3 | DataA31 | | | '----'---------'----'---------'
Правое соединение (или правое внешнее соединение) в столбце
Id
вернет столбцы из обеих таблиц и соответствующие записи с записями из правой таблицы (нулевые значения из левой таблицы):Полное внешнее объединение в столбце
Id
вернет столбцы из обеих таблиц и соответствующие записи с записями из левой таблицы (нулевые значения из правой таблицы) и записи из правой таблицы (нулевые значения из левой таблицы):Left Semi Join on column
Id
вернет столбцы только из левой таблицы, а соответствующие записи - только из левой таблицы:источник
Пробовал в Hive и получил следующий результат
Таблица 1
Таблица 2
Внутреннее соединение
Левое соединение
Левое полусоединение
источник
Пытаюсь изобразить диаграммами Венна для лучшего понимания ..
Левое полусоединение: полусоединение возвращает значения из левой части отношения, совпадающей с правой . Это также называется левым полусоединением.
Примечание. Есть еще одна вещь, называемая левым антисоединением: антисоединение возвращает значения из левого отношения, не совпадающего с правым . Его также называют левым антисоединением.
Внутреннее соединение : выбирает строки, которые имеют совпадающие значения в обоих отношениях.
источник