Was ist der Unterschied zwischen einem INNER JOIN
und LEFT SEMI JOIN
?
Warum erhalte ich im folgenden Szenario zwei unterschiedliche Ergebnisse?
Die INNER JOIN
Ergebnismenge ist viel größer. Kann jemand erklären? Ich versuche, die Namen zu bekommen, die table_1
nur in erscheinen 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
sollte mehr Zeilen zurückgeben als dasinner join
.inner join
gibt nur Daten zurück, wenn zwischen beiden Tabellen eine Übereinstimmung besteht. Derleft join
gibt Daten aus der ersten Tabelle zurück, unabhängig davon, ob in der zweiten Tabelle ein übereinstimmender Datensatz gefunden wurde.LEFT SEMI JOIN
gibt nur eine Zeile von links zurück, auch wenn rechts mehrere Übereinstimmungen vorhanden sind. AnINNER JOIN
gibt mehrere Zeilen zurück, wenn rechts mehrere Übereinstimmungen vorhanden sind.Antworten:
Sie
INNER JOIN
können Daten aus den Spalten beider Tabellen zurückgeben und Werte von Datensätzen auf beiden Seiten duplizieren, die mehr als eine Übereinstimmung aufweisen. ALEFT SEMI JOIN
kann nur Spalten aus der linken Tabelle zurückgeben und liefert einen von jedem Datensatz aus der linken Tabelle, in der eine oder mehrere Übereinstimmungen in der rechten Tabelle vorhanden sind (unabhängig von der Anzahl der Übereinstimmungen). Es ist äquivalent zu (in Standard-SQL):SELECT name FROM table_1 a WHERE EXISTS( SELECT * FROM table_2 b WHERE (a.name=b.name))
Wenn die rechte Spalte mehrere übereinstimmende Zeilen enthält,
INNER JOIN
gibt a für jede Übereinstimmung in der rechten Tabelle eine Zeile zurück, während aLEFT SEMI JOIN
nur die Zeilen aus der linken Tabelle zurückgibt, unabhängig von der Anzahl der übereinstimmenden Zeilen auf der rechten Seite. Aus diesem Grund sehen Sie in Ihrem Ergebnis eine andere Anzahl von Zeilen.Dann
LEFT SEMI JOIN
ist a die geeignete Abfrage.quelle
LEFT SEMI JOIN
? Ist das nicht nur einSEMI JOIN
? Es macht keinen SinnRIGHT SEMI JOIN
, oder?Angenommen, es gibt 2 Tabellen TabelleA und TabelleB mit nur 2 Spalten (ID, Daten) und folgenden Daten:
Tabelle A:
+----+---------+ | Id | Data | +----+---------+ | 1 | DataA11 | | 1 | DataA12 | | 1 | DataA13 | | 2 | DataA21 | | 3 | DataA31 | +----+---------+
Tabelle B:
+----+---------+ | Id | Data | +----+---------+ | 1 | DataB11 | | 2 | DataB21 | | 2 | DataB22 | | 2 | DataB23 | | 4 | DataB41 | +----+---------+
Inner Join on column
Id
gibt Spalten aus beiden Tabellen und nur die übereinstimmenden Datensätze zurück:.----.---------.----.---------. | 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 (oder Left Outer Join) in der Spalte
Id
gibt Spalten sowohl aus den Tabellen als auch übereinstimmende Datensätze mit Datensätzen aus der linken Tabelle zurück (Nullwerte aus der rechten Tabelle):.----.---------.----.---------. | 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 (oder Right Outer Join) in der Spalte
Id
gibt Spalten aus beiden Tabellen zurück und vergleicht Datensätze mit Datensätzen aus der rechten Tabelle (Nullwerte aus der linken Tabelle):Full Outer Join on-Spalte
Id
gibt Spalten sowohl aus den Tabellen als auch übereinstimmende Datensätze mit Datensätzen aus der linken Tabelle (Nullwerte aus der rechten Tabelle) und Datensätzen aus der rechten Tabelle (Nullwerte aus der linken Tabelle) zurück:Left Semi Join on-Spalte
Id
gibt nur Spalten aus der linken Tabelle und übereinstimmende Datensätze nur aus der linken Tabelle zurück:quelle
Versuchte in Hive und bekam die folgende Ausgabe
Tabelle 1
Tabelle 2
Inner Join
Links beitreten
Linke Semi Join
quelle