Jaka jest różnica między INNER JOIN
i LEFT SEMI JOIN
?
W poniższym scenariuszu, dlaczego otrzymuję dwa różne wyniki?
Zestaw INNER JOIN
wyników jest dużo większy. Czy ktoś może wyjaśnić? Próbuję uzyskać nazwy, table_1
które pojawiają się tylko w 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
Należy wracać więcej wierszy niżinner join
.inner join
Powróci dane tylko wtedy, gdy istnieje zgodność między obu tabelach.left join
Zwróci dane z pierwszej tabeli niezależnie od tego czy rekord zostanie znaleziony w drugiej tabeli.LEFT SEMI JOIN
zwróci tylko jeden wiersz od lewej, nawet jeśli po prawej jest wiele dopasowań. AnINNER JOIN
zwróci wiele wierszy, jeśli po prawej stronie znajduje się wiele dopasowań.Odpowiedzi:
INNER JOIN
Może zwrócić dane z kolumn z obu tabel, a może powielać wartości rejestrów po obu stronach mają więcej niż jeden mecz. ALEFT SEMI JOIN
może zwracać tylko kolumny z tabeli po lewej stronie i zwraca jeden z każdego rekordu z tabeli po lewej stronie, w której znajduje się jedno lub więcej dopasowań w tabeli po prawej stronie (niezależnie od liczby dopasowań). Jest to odpowiednik (w standardowym SQL):SELECT name FROM table_1 a WHERE EXISTS( SELECT * FROM table_2 b WHERE (a.name=b.name))
Jeśli w prawej kolumnie znajduje się wiele pasujących wierszy, polecenie a
INNER JOIN
zwróci jeden wiersz na każde dopasowanie w prawej tabeli, a aLEFT SEMI JOIN
zwróci tylko wiersze z lewej tabeli, niezależnie od liczby pasujących wierszy po prawej stronie. Dlatego w wyniku widzisz inną liczbę wierszy.Następnie
LEFT SEMI JOIN
należy użyć odpowiedniego zapytania.źródło
LEFT SEMI JOIN
? Czy to nie jest po prostuSEMI JOIN
? Nie ma sensuRIGHT SEMI JOIN
, prawda?Załóżmy, że istnieją 2 tabele TableA i TableB z tylko 2 kolumnami (Id, Data) i następującymi danymi:
Tabela A:
+----+---------+ | Id | Data | +----+---------+ | 1 | DataA11 | | 1 | DataA12 | | 1 | DataA13 | | 2 | DataA21 | | 3 | DataA31 | +----+---------+
Tabela B:
+----+---------+ | Id | Data | +----+---------+ | 1 | DataB11 | | 2 | DataB21 | | 2 | DataB22 | | 2 | DataB23 | | 4 | DataB41 | +----+---------+
Wewnętrzne sprzężenie w kolumnie
Id
zwróci kolumny z obu tabel i tylko pasujące rekordy:.----.---------.----.---------. | 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 | '----'---------'----'---------'
Left Join (lub Left Outer Join ) w kolumnie
Id
zwróci kolumny z obu tabel i pasujące rekordy z rekordami z lewej tabeli (wartości Null z prawej tabeli):.----.---------.----.---------. | 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 | | | '----'---------'----'---------'
Right Join (lub Right Outer join) w kolumnie
Id
zwróci kolumny z obu tabel i pasujące rekordy z rekordami z prawej tabeli (wartości Null z lewej tabeli):Pełne połączenie zewnętrzne w kolumnie
Id
zwróci kolumny z obu tabel i pasujące rekordy z rekordami z lewej tabeli (wartości Null z prawej tabeli) i rekordy z prawej tabeli (wartości Null z lewej tabeli):Lewe półłączenie w kolumnie
Id
zwróci kolumny tylko z lewej tabeli i pasujące rekordy tylko z lewej tabeli:źródło
Wypróbowałem w Hive i otrzymałem poniższe wyniki
Tabela 1
Tabela 2
Połączenie wewnętrzne
Left Join
Połączyć lewe
źródło