NOT IN 서브쿼리 문의입니다

115 views
Skip to first unread message

이정환

unread,
Aug 23, 2016, 12:51:50 AM8/23/16
to Apache Tajo 한국 사용자 그룹
안녕하세요.

Tajo 0.11.3을 사용하고 있습니다.
SQL 서브쿼리시 NOT IN을 사용하면 not implemented feature: Not-in subquery 에러가 발생 합니다.

아래 도큐멘트를 봐도 서브쿼리시 NOT IN 사용 예제가 있습니다만

NOT IN과 함께 서브쿼리를 하면 에러가 발생 합니다.
아래와 같이 해 보았습니다만 잘못 쿼리한 부분이 있는지 궁금합니다.

-----
-- test1 테이블 생성
CREATE EXTERNAL TABLE default.test1
(
  unum int,
  uname text
) using text with('text.delimiter'=',') location 'hdfs://htm-0001:9000/tajo/temp/test1';

-- test2 테이블 생성
CREATE EXTERNAL TABLE default.test2
(
  unum int,
  uname text
) using text with('text.delimiter'=',') location 'hdfs://htm-0001:9000/tajo/temp/test2';

-- test1.csv, test2.csv 파일 생성후 해당 위치에 각각 copy
1,a
2,b
3,c
4,d
5,e
6,f

-- 에러 없이 쿼리 성공
SELECT *
  FROM default.test1
WHERE uname NOT IN ('a','b') 

-- not implemented feature: Not-in subquery 에러 발생
SELECT *
  FROM default.test1
WHERE uname NOT IN (SELECT uname FROM default.test2 WHERE uname IN ('a','b')) 

org.apache.tajo.exception.NotImplementedException: not implemented feature: Not-in subquery [SQL State=0A000, DB Errorcode=202]

-- 동일하게 not implemented feature: Not-in subquery 에러 발생
SELECT *
  FROM default.test1
WHERE unum NOT IN (SELECT avg(unum) FROM default.test2 WHERE uname IN ('a','b'))
----------

또한 NOT IN 쿼리와 서브 쿼리를 사용할 수 없다면 우회하여 NOT IN을 사용할 수 있는 방법은 없는지요?

확인을 부탁 드립니다.

이정환

unread,
Aug 24, 2016, 8:44:28 PM8/24/16
to Apache Tajo 한국 사용자 그룹
요즘 많이들 바쁘신지 답변이 없어 이곳 저곳 찾아보다가 아래와 같이  SQL을 우회해 보았습니다.
자문자답 입니다만 더 좋은신 의견이 있으시면 부탁 드립니다.

----
원래 NOT IN을 사용하고 싶었던 SQL은 다음 이었습니다

SELECT *
  FROM default.test1
WHERE uname NOT IN (SELECT uname FROM default.test2) 

not implemented feature: Not-in subquery 에러가 발생하여 다음과 같이 우회해 보았습니다.
----

SELECT *
  FROM default.test1
WHERE uname IN (SELECT uname FROM default.test2 WHERE uname NOT IN ('a','b')) 

설명을 돕기 위한 예제 여서 실제로는 test2에 없는 test1에만 있는 uname의 결과를 얻고 싶었기 때문에 위와 같은 방법도 있겠지만
다음과 같이 하여 해결 해 보았습니다.

------------------
-- 우회 1
SELECT A.unum, A.uname
  FROM default.test1 A
    LEFT JOIN default.test2 B ON A.uname = B.uname
WHERE B.uname IS NULL;

현재 test1.csv와 test2.csv 내용이 같아 결과 값은 아무것도 나오지 않겠지만 다르다는 전재로 하고 순수 test1에만 있는 uname을 찾는데
LEFT JOIN을 이용하여 해결 하였습니다.
------------------

NOT IN과 subquery를 이용하여 쿼리하고 싶은 경우 참고가 되었으면 좋겠습니다.

감사합니다.


------
2016년 8월 23일 화요일 오후 1시 51분 50초 UTC+9, 이정환 님의 말:
Reply all
Reply to author
Forward
0 new messages