2017-02-12 7 views
1

複数のテーブルでどのように左セミ結合を使用できますか?たとえば、SQLではnoを取得するクエリです。左セミハイブで複数のテーブルを結合

select name,job_id,sal 
from emp 
where dept_id IN (select dept_id 
        from dept d 
         INNER JOIN Location L 
         on d.location_id = L.location_id 
         where L.city='US' 
       ) 

INクエリがハイブでサポートされていないため、これをどのようにHiveに書くことができますか。代わりに

+0

あなたはまだここにいますか? –

答えて

0

使用exists

select e.name, e.job_id, e.sal 
from emp e 
where exists (select 1 
       from dept d join 
        location L 
        on d.location_id = L.location_id 
       where l.city = 'US' and d.dept_id = e.dept_id 
      ); 

あなたはWHERE句にサブクエリをカバーdocumentation、を参照することができます。

このクエリは、米国に所在する部署でどのような従業員が働いているかという質問に答えているようです。サブクエリを使用してFROM句でこれを行うこともできます。

select e.name, e.job_id, e.sal 
from emp e join 
    (select distinct d.dept_id 
     from dept d join 
      location L 
      on d.location_id = L.location_id 
     where l.city = 'US' 
    ) d 
    on d.dept_id = e.dept_id; 

"US"は通常都市とはみなされません。

EDIT:明らか

、部署が一つだけの場所を持つことができる場合は、「半参加は、」必要はありません。 SELECT DISTINCTはちょうどSELECTになります。 。 。あるいは、Duduの答えのようにJOINを使うことができます。どんな場合でもEXISTSが動作します。多くのデータベースでは良い(時には最高のパフォーマンス)があります。私はHiveのパフォーマンスへの影響についてはわかりません。

+0

'distinct'? .... –

+0

@DuduMarkovitz。 。 。はい。部門は、(合理的に)同じ都市/国に複数の場所を持つことができます。あなたのバージョンは重複を返します。セミジョインは、単に2番目のテーブルに存在をチェックするだけで、最初のテーブルの行を複製することはできません。 –

+0

'dept'が' location_id'を持つこのテーブル構造ではありません –

0

シンプルなインナーが

select e.name 
     ,e.job_id 
     ,e.sal 

from    emp   as e 

     join  dept  as d 

     on   d.dept_id = 
        e.dept_id 

     join  location as l 

     on   l.location_id = 
        d.location_id 

where l.city='US' 

P.S.参加するように思えます

ハイブはINをサポートしています。

dept_idempであることは唯一の問題です(emp.dept_id)。
作品:

select name,job_id,sal 
from emp 
where emp.dept_id IN (select dept_id 
        from dept d 
         INNER JOIN Location L 
         on d.location_id = L.location_id 
         where L.city='US' 
       ) 
+0

こんにちは、まだここですか? –

関連する問題