[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.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을 실행하는 것보다하지 않습니다.
from https://stackoverflow.com/questions/34861516/spark-replacement-for-exists-and-in by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 오라클의 기본 날짜 형식 (0) | 2020.05.14 |
---|---|
[SQL] TOP에 대한 N 타이 PostgreSQL의 상당 : LIMIT "관계와?" (0) | 2020.05.14 |
[SQL] 자바에서 테이블 반환 매개 변수와 함께 저장 프로 시저를 호출 (0) | 2020.05.14 |
[SQL] 프로그래밍 / 동적 SQL에 WHERE 절을 추가 (0) | 2020.05.14 |
[SQL] 행되지 존재하는 경우 삽입 신탁 (0) | 2020.05.14 |