복붙노트

[SQL] 존재 IN에 대한 스파크 교체

SQL

존재 IN에 대한 스파크 교체

나는 존재 절을 사용하는 쿼리를 실행하려고 :

select <...>    
  from A, B, C
where
  A.FK_1 = B.PK and
  A.FK_2 = C.PK and
  exists (select A.ID from <subquery 1>) or 
  exists (select A.ID from <subquery 2>) 

불행하게도,이 지원하지 않는 것 같습니다. 나는 또한이 IN 절과 절을 EXISTS 교체 시도했다 :

select <...>    
  from A, B, C
where
  A.FK_1 = B.PK and
  A.FK_2 = C.PK and
  A.ID in (select ID from ...) or
  A.ID in (select ID from ...)

불행하게도, 또한 IN 절은 지원되지 않는 것 같습니다.

내가 원하는 결과를 달성하는 SQL 쿼리를 쓸 수있는 방법에 어떤 아이디어? 나는 원칙적으로 또 다른 가입으로 WHERE 절 및 UNION으로 두 번째 OR 절을 모델링 할 수 있지만, 슈퍼 서투른 것 같다 ..

편집 : 가능한 솔루션의 숫자를 준다.

해결 방법 1

select <...>    
  from A, B, C
       (select ID from ...) as exist_clause_1,
       (select ID from ...) as exist_clause_2,
where
  A.FK_1 = B.PK and
  A.FK_2 = C.PK and
  A.ID = exist_clause_1.ID or
  A.ID = exist_clause_2.ID

해결 방법 2

select <...>    
  from A, B, C
       ( (select ID from ...) UNION
         (select ID from ...)
        ) as exist_clause,
where
  A.FK_1 = B.PK and
  A.FK_2 = C.PK and
  A.ID = exist_clause.ID

해결법

  1. ==============================

    1.SparkSQL는 현재 존재 & IN이 없습니다. "(최신) 스파크 SQL / DataFrames 및 데이터 집합 가이드 / 지원 하이브 특징"

    SparkSQL는 현재 존재 & IN이 없습니다. "(최신) 스파크 SQL / DataFrames 및 데이터 집합 가이드 / 지원 하이브 특징"

    EXISTS 및 IN 항상 JOIN 또는 LEFT 세미 가입하여 다시 작성할 수 있습니다. "아파치 스파크 SQL은 현재 IN 또는 EXISTS 서브 쿼리를 지원하지 않지만, 당신은 효율적으로 왼쪽 세미 조인을 사용하는 쿼리를 다시 작성하여 의미를 구현할 수 있습니다." OR은 항상 UNION을 사용하여 다시 작성 될 수있다. 과를 제외하고 사용하여 다시 작성 될 수 없습니다.

    테이블은 몇 가지 조건 (열 이름에 의해 파라미터 문) 사실을 행을 원하는 분야

    (다시는이 대답을 참조 일반적으로 쿼리.)

    그래서 SQL에 해당하는 마음 술어 표현식에서 유지하여 당신은 및 / 또는 재구성 쿼리를 작성하는 간단한 논리 재 작성 규칙을 사용할 수 있습니다. 예 가독성 또는 실행의 측면에서 중 "서투른"할 필요는 여기에 UNION을 사용.

    원래 질문은 당신이 UNION을 사용할 수와 소비세는 원래 쿼리에서 존재 IN 것을 당신이 당신의 질문에 변형을 편집 한 것을 이해 것으로 나타났다. 여기에 또한 또는 절개 다른 변형이다.

        select <...>    
        from A, B, C, (select ID from ...) as e
        where
          A.FK_1 = B.PK and
          A.FK_2 = C.PK and
          A.ID = e.id
    union
        select <...>    
        from A, B, C, (select ID from ...) as e
        where
          A.FK_1 = B.PK and
          A.FK_2 = C.PK and
          A.ID = e.ID
    

    귀하의 해결 방법 1은 당신이하지 생각하지 않습니다. exists_clause 테이블 하나가 비어있는 경우가 있습니다 즉 경우에도 ID, 다른에서 사용할 수 일치하는 테이블의 FROM 크로스 제품은 비어 있고 더 행은 반환되지 않습니다. ( "SQL 의미의 직관적의 결과"제 6 장 데이터베이스 시스템의 데이터베이스 언어 SQL 사이드 바 페이지 264 :. 완전한 책 2 판) A는 단지 테이블의 행에 대한 이름을 도입되지 않은에서, 교차 결합 및 / 또는 OUTER입니다 그들에 합류 한 후 ON (내부 조인을 위해) 및 WHERE 필터 일부 아웃.

    성능은 동일한 행을 반환하는 다른 표현에 대한 일반적 다릅니다. 이 DBMS 최적화에 따라 달라집니다. DBMS의 및 / 또는 프로그래머가 알 수 있습니다 만약 그렇다면 또는 알 수 없습니다 수 있으며 여부를 최적의 균형, 쿼리 및이를 작성하는 가장 좋은 방법을 평가하는 가장 좋은 방법에 영향을 미칠 수있는 수 많은 세부 사항. 그러나 (또한 후반 해결 방법 2를 원래 쿼리 같이하지만)은 WHERE에 행 당 두 개의 OR 연산 부속 선택을 실행하는 것은 (내 쿼리로) 반드시 더 나은 두 개의 SELECT들 중 하나 UNION을 실행하는 것보다하지 않습니다.

  2. from https://stackoverflow.com/questions/34861516/spark-replacement-for-exists-and-in by cc-by-sa and MIT license