Разница между INNER JOIN и LEFT SEMI JOIN
В чем разница между 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)
Ответы
Ответ 1
An INNER JOIN
возвращает столбцы из обеих таблиц. A LEFT 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
возвращает строки из левой таблицы. Вот почему вы видите другое количество строк в вашем результате.
Я пытаюсь получить имена в таблице_1, которые появляются только в таблице_2.
Тогда a LEFT SEMI JOIN
- соответствующий запрос для использования.
Ответ 2
Пробовал в улье и получил нижний вывод
таблица1
1, wqe, chennai, india
2, ст, Salem, Индия
3, Mia, Bangalore, India
4, yepie, NewYork, США
таблица2
1, ЧКЕ, Ченнай, Индия
2, ст, Salem, Индия
3, Mia, Bangalore, India
5, chapie, Лос-Анджелес, США
Внутреннее соединение
SELECT * FROM table1 INNER JOIN table2 ON (table1.id = table2.id);
1 wqe chennai india 1 wqe chennai india
2 stu salem india 2 stu salem india
3 mia bangalore india 3 mia bangalore india
Левая регистрация
SELECT * FROM table1 LEFT JOIN table2 ON (table1.id = table2.id);
1 wqe chennai india 1 wqe chennai india
2 stu salem india 2 stu salem india
3 mia bangalore india 3 mia bangalore india
4 yepie newyork USA NULL NULL NULL NULL
Левая полуавтоматизация
SELECT * FROM table1 LEFT SEMI JOIN table2 ON (table1.id = table2.id);
1 wqe chennai india
2 stu salem india
3 mia bangalore india
Примечание: отображаются только записи в левой таблице, тогда как для Left Join отображаются как отображаемые записи таблицы
Ответ 3
Предположим, что есть 2 таблицы TableA и TableB с двумя столбцами (Id, Data) и следующими данными:
TableA:
Данные идентификатора
1 DataA11
1 DataA12
1 DataA13
2 DataA21
3 DataA31
TableB:
Данные идентификатора
1 DataB11
2 DataB21
2 DataB22
2 DataB23
4 DataB41
Внутренняя идентификация в столбце Id возвращает столбцы из обеих таблиц и только соответствующие записи:
Данные идентификатора данных Id
1 DataA11 1 DataB11
1 DataA12 1 DataB11
1 DataA13 1 DataB11
2 DataA21 2 DataB21
2 DataA21 2 DataB22
2 DataA21 2 DataB23
Left Join (или Left external join) в столбце Id будет возвращать столбцы из обеих таблиц и сопоставлять записи с записями из левой таблицы (значения Null из правой таблицы):
Данные идентификатора данных Id
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
Right Join (или правое внешнее соединение) в идентификаторе столбца будет возвращать столбцы из обеих таблиц и сопоставлять записи с записями из правой таблицы (значения Null из левой таблицы):
Данные идентификатора данных Id
1 DataA11 1 DataB11
1 DataA12 1 DataB11
1 DataA13 1 DataB11
2 DataA21 2 DataB21
2 DataA21 2 DataB22
2 DataA21 2 DataB23
4 DataB41
Outer Join (или полное внешнее объединение) в идентификаторе столбца возвращает столбцы из обеих таблиц и сопоставляя записи с записями из левой таблицы (значения Null из правой таблицы) и записи из правой таблицы (значения Null из левой таблицы):
Данные идентификатора данных Id
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
4 DataB41
Left Semi Join в столбце Id вернет столбцы только из левой таблицы и сопоставляет записи только из левой таблицы:
Данные идентификатора
1 DataA11
1 DataA12
1 DataA13
2 DataA21