2013-05-29 24 views
6

Her ikisinde de bir sütun kimliğine sahip iki A ve B tablosu var. Bariz bir şekilde B. bulunmaz A'dan kimlikleri almak isteyen: Hive desteklemiyor, mevcut. Aşağıdaki sorguyu nasıl yazarım?

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

Maalesef kovan içinde desteklemediği, var veya alt sorgular. Yukarıdaki katılımları birleştirmek için bir yolu var mı?

aşağıdaki

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

düşünce Ama hep A'da herhangi id eşit değildir B'de bir kimlik var çünkü bu, A bütününü dönecektir gibi görünüyor

cevap

21

sen Hive bir LEFT OUTER JOIN ile aynı yapabilirsiniz:

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

Çok teşekkürler bakın! Bu çalıştı. – elexhobby

2

hiç şekilde bir IN yapmak istiyorum olmalı:

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

Hive bu LEFT SEMI JOIN ile kaplı etti:

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

Kovan 0.13 ila IN, NOT IN, EXIST ve NOT EXISTS destekler görünmektedir. EXIST yılında

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

subqueries ve (yukarıda örnekteki gibi b.tailnum = a.tailnum) NOT EXISTS korelasyon olması gereken yüklemler fazlası için , Hive Wiki > Subqueries in the WHERE Clause