2013-05-29 8 views
6

Ich habe zwei Tabellen A und B, die beide eine Spalten-ID haben. Ich wünsche ids von A zu erhalten, die in B. Die offensichtliche Art und Weise nicht vorhanden sind, ist:Hive unterstützt nicht, existiert. Wie schreibe ich die folgende Abfrage?

SELECT id FROM A WHERE id NOT IN (SELECT id FROM B) 

Leider Hive unterstützt nicht in, existiert oder Subqueries. Gibt es eine Möglichkeit, das oben genannte mit Joins zu erreichen?

Ich dachte an den folgenden

SELECT A.id FROM A,B WHERE A.id<>B.id 

Aber es scheint, als ob dies die gesamten A zurückkehrt, da es immer eine ID in B existiert, die nicht gleich jede ID in A. ist

Antwort

21

Sie können mit einem LEFT OUTER JOIN in Hive das gleiche tun:

SELECT A.id 
FROM A 
LEFT OUTER JOIN B 
ON (B.id = A.id) 
WHERE B.id IS null 
+0

Vielen Dank! Das hat funktioniert. – elexhobby

2

Sollten Sie jemals eine IN wie dies tun möchten:

SELECT id FROM A WHERE id IN (SELECT id FROM B) 

Hive hat dies mit einem LEFT SEMI JOIN bedeckt:

SELECT a.key, a.val 
FROM a LEFT SEMI JOIN b on (a.key = b.key) 
2

Hive scheint IN, NOT IN, EXIST und NOT EXISTS von 0,13 zu unterstützen.

select count(*) 
from flight a 
where not exists(select b.tailnum from plane b where b.tailnum = a.tailnum); 

Die Subqueries in EXIST und NOT EXISTS sollten Prädikate korreliert ist (wie b.tailnum = a.tailnum in obigem Beispiel) Für weitere Informationen siehe Hive Wiki > Subqueries in the WHERE Clause

Verwandte Themen