2013-05-29 9 views
6

Mam dwie tabele A i B, które obie mają identyfikator kolumny. Życzę, aby uzyskać identyfikatory z A, które nie są obecne w B. Oczywistym sposobem jest:Hive nie obsługuje, istnieje. Jak napisać następujące zapytanie?

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

Niestety, Hive nie obsługuje w istnieje lub podzapytania. Czy istnieje sposób, aby osiągnąć powyższe przy użyciu sprzężeń?

Myślałem o następującym

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

Ale wydaje się, że ten powróci całość A ponieważ nie zawsze istnieje id w B, która nie jest równa w każdym id A.

Odpowiedz

21

można zrobić to samo z LEFT OUTER JOIN w Ulu:

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

dzięki! To zadziałało. – elexhobby

2

Jeśli kiedykolwiek chcesz zrobić IN jak tak:

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

Hive jest to pokryta LEFT SEMI JOIN:

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

Hive wydaje się wspierać IN, NOT IN, EXIST i NOT EXISTS od 0,13.

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

W podzapytania w EXIST i NOT EXISTS powinny były skorelowane predykaty (np b.tailnum = a.tailnum w powyższej próbie) więcej, odnoszą Hive Wiki > Subqueries in the WHERE Clause

Powiązane problemy