사용자가 보낸 값들이 DB에 존재하는지 확인? 0 6 1,428

by Maximus [MySQL] [2013.12.02 10:50:36]



안녕하세요?
WEB 환경에서 사용자가 보낸 특정 값들이(예, 사원번호) DB에 존재하는지 확인하는 쿼리를 작성중입니다.
예를들어, 사용자가 아래와 같이 값을 보내는 경우, (특정 테이블의 Key)

100001 => DB에 있음
100002 => DB에 있음
100003 => DB에 없음
100010 => DB에 없음

결과 값으로 DB에 없는 값들을 보여주는 겁니다.

결과 :
100003
100010

Oracle 같은 경우 connect by를 사용하여 temp table를 만들고 해당 테이블과 Left Join 하여 찾으면 되는데
MYSQL은 connect by가 없어 애로 사항이 있습니다.
Application에서 Dynamic하게 union all를 사용하여 temp table를 만들수 있지만 더 나은 방법이 없을까 질문드립니다.
아래 쿼리를 수행하면 제가 원한는 값이 나옵니다.
이렇게 말고 좀 더 효율적인 방법이 없을까 고민중입니다.

select t.empno
from employee e right join
(select 100001  as ctid union all
 select 100002  union all
 select 100003  union all
 select 100010) t on e.empno = t.empno
where e.empno is null
by 아발란체 [2013.12.02 10:58:29]

아래 질의만 보면 굳이 CONNECT BY를 쓰지 않아도 될 것 같습니다.
SELECT * FROM EMPLOYEE WHERE empno IN('100001', '100002', '100003', '100010')
만약 가상 테이블을 만들어 한다면 아래 쓰신(UNION ALL) 방법도 괜찮아 보입니다.
꼭 가상 테이블을 만들어 한다면
구글에 "MYSQL CONNECT BY"로 검색하면 많은 방법이 있지만
여기서도 비슷한 질문과 답변이 있는 것 같아 링크 적습니다.
http://www.gurubee.net/article/58575


by Maximus [2013.12.02 11:08:16]
@아발란체님

가상 테이블을 꼭 만들어야 하는건 아닙니다.
사용자가 넣는 값들이 많을 경우 union all을 쓰는게 성능 이슈가 발생할지 몰라
다른 방법이 없나 고민 중입니다. (값이 200-300개 정도 예상) 

by 아발란체 [2013.12.02 11:20:42]

200-300개면 개수가 꽤 많네요,
그래도 성능 이슈로 본다면 디스크 보다 메모리 사용으로 감당이 될 것 같고
MySQL CONNECT BY 구현 방법으로 가는 것 보다
UNION ALL 방법 보다 IN으로 가는 것이 부하가 제일 적을 것 같습니다.


by Maximus [2013.12.02 11:29:27]

IN으로 쓰는 건 어떤 방법을 말씀하시는 건지요?

SELECT * FROM EMPLOYEE WHERE empno IN('100001', '100002', '100003', '100010')

위의 질의는 DB에 존재한는 값만 나올테고 없는 값들은 찾을 수 없지요.
제가 원하는 건 IN 안에 들어간 값들 중에 DB에 존재하지 않는 값들입니다.

by 아발란체 [2013.12.02 11:47:52]
아, RIGHT OUTER JOIN이군요, 그럼 사용하신 UNION ALL이 방법이 괜찮아 보이는데요. ^.^;
MINUS 함수가 최적화 되도 결국 OUTER JOIN으로 쿼리 변환 될 것 같고
어설픈 사용자 함수로 CONENCT BY 구현 하는 것 보다 사용 하신 방법이 성능상으로는 좋을 것 같습니다.

by 마농 [2013.12.02 18:02:33]

오라클도 Connect By Level < n 를 이용한 행복제는 9i 부터 가능했습니다.
그 이전버전에서는 copy_t 라고 하는 복제용 테이블을 미리 만들어 놓고 사용했습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입