2016-12-07 53 views
1

我有這樣的查詢,並且顯然Impala不支持SELECT語句中的子查詢。我如何在Impala中整齊地重寫它?(impala)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 
... 

你的查詢有以下錯誤(S):

AnalysisException:子查詢不在選擇列表的支持。

回答

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)   
...