2016-12-07 2 views
1

이 같은 쿼리가 있는데 임팔라는 SELECT 문에서 하위 쿼리를 지원하지 않는 것처럼 보입니다. 임팔라에서 어떻게 깔끔하게 다시 쓸 수 있습니까?(임팔라) 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 절에 하위 쿼리를 배치하므로 내부 조인 또는 왼쪽 조인을 통해 하위 쿼리를 주 테이블에 연결합니다. 임팔라에서 복잡한 유형을 다룰 때는 대개 이렇게합니다.

그러나 특정 예제에서는 조인이 성공적인지 ('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)   
...