2016-12-07 7 views
1

このようなクエリがあり、明らかにImpalaはSELECT文でサブクエリをサポートしていません。 Impalaでどうすればきれいに書き直すことができますか?(インパラ)AnalysisException:サブクエリが選択リストでサポートされていません

AnalysisException:

SELECT 
    col1, 
    col2, 
    ... 
    CASE 
    WHEN (SELECT 1 
      FROM 
      table1 x, 
      table2 y 
      WHERE 
      x.id = y.id 
      LIMIT 1) = 1 
    THEN 
     'A' 
    ELSE 
     'B' 
    END 
    coln 

FROM 
... 

あなたのクエリが次のエラー(複数可)を持つサブクエリは、選択リストにはサポートされていません。

答えて

1

あなたは

SELECT col1, col2, ... 'A' coln 
    FROM ... 
    WHERE EXISTS (SELECT 1 FROM table1 x, table2 y WHERE x.id = y.id LIMIT 1) 
UNION ALL 
SELECT col1, col2, ... 'B' coln 
    FROM ... 
    WHERE NOT EXISTS (SELECT 1 FROM table1 x, table2 y WHERE x.id = y.id LIMIT 1) 

は保証を試すことができなかった、それを自分自身を試していません。

+0

ありがとうございます。しかし、実際は非常に大規模なクエリですが、複数のサブクエリがあり、このように言い換えて威圧しています:)そして、私が間違っていないと余分なプロセッサ時間がかかります。 – burakongun

+0

私は自分でクエリプランをチェックしていませんが、あなたの例のサブクエリはメインクエリとは独立しているので、一度だけ評価されると思います。依存サブクエリを使用している場合は、代わりに結合を使用できますが、これを実行する最善の方法は実際のクエリによって異なります。 – Zoltan

0

一般的に、よりクリーンなソリューションでは、FROM句にサブクエリを配置しているため、サブクエリを内部または左ジョインを介してメインテーブルにリンクしています。私は通常、Impalaの複雑な型を扱うときにこれを行います。

ただし、特定の例では、結合が成功したかどうか( 'A')、そうでないか( 'B')を示す各行のフィールドを定義する左結合を試みています。この場合、次の操作を実行できます。

SELECT 
    x.id, x.col2, x.col3, ... 
    CASE 
    WHEN y.id IS NOT NULL THEN 'A' 
    ELSE 'B' 
    END 
    coln 
FROM table1 x LEFT JOIN 
    table2 y USING (id)   
... 
関連する問題