12

単一のキー列を持つ 2 つのテーブルがあります。テーブル a のキーは、テーブル b のすべてのキーのサブセットです。テーブル a にないキーをテーブル b から選択する必要があります。

Hive マニュアルからの引用は次のとおりです。 LEFT SEMI JOIN を使用する際の制限は、右側のテーブルが結合条件 (ON 句) でのみ参照され、WHERE 句や SELECT 句などでは参照されないことです。 "

彼らは説明のために次の例を使用します。

    SELECT a.key, a.value FROM a WHERE a.key IN (SELECT b.key FROM B);

に等しい

    SELECT a.key, a.val FROM a LEFT SEMI JOIN b ON (a.key = b.key);

しかし、私がする必要があるのは、「NOT IN;」を使用した最初の例です。残念ながら、この構文は Hive 0.13 ではサポートされていません。これは説明のみを目的としています。

    SELECT a.key, a.value FROM a WHERE a.key NOT IN (SELECT b.key FROM B);

このサイトで推奨事項を検索したところ、次の例が表示されました。

    SELECT a.key FROM a LEFT OUTER JOIN b ON a.key = b.key WHERE b.key IS NULL;

期待どおりに動作しません。a.key NOT in b と a.key IN b に参加すると、この方法では元の a を取得できません。太字のテキストに注意してください - b.key は WHERE に表示されるべきではありません。

じゃあどうすればいいの?他のトリックはありますか?ありがとう!

PS私は実際のデータを共有することはできません。これは非常に単純な例で、a のキーはすべて b に含まれ、a は b のサブセットです。

4

4 に答える 4

7

表 b の結果が必要な場合は、代わりに次のようにできますか?

  SELECT b.key FROM b LEFT OUTER JOIN a ON b.key = a.key WHERE a.key IS NULL;
于 2014-11-03T02:49:20.860 に答える