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

by Maximus [MySQL] MYSQL [2013.11.28 16:16:30]



안녕하세요?
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를 만들수 있지만 더 나은 방법이 없을까 질문드립니다.

by 아발란체 [2013.11.28 17:25:52]
웹에서 보내는 값이 사원 번호이고,
확인 할 때 DB로 요청 하는 사원 번호 수가 1개 이상이 될 수 있고
요청 값은 10001, 10002식으로 배열로 보낸다고 하면
프로그램단에서 이 값을 바인딩 할 때
SQL은
SELECT 사원번호 FROM 테이블 WHERE 사원번호IN(?);
바인딩 하는 값은 ['10001', '10002'] 형태로 보내면
말씀 하신 결과 형태로 데이타셋을 받을 수 있지 않을까용? @.@)/

by Maximus [2013.11.28 17:31:50]

@아발란체님
말씀하신 내용데로 하면 DB에 있는 데이터셋을 받을수는 있습니다.
제가 원하는건 그 반대의 결과입니다.
바인딩 값들중에 DB에 없는 값들을 받는거지요.

by 사랑초 [2013.11.29 10:27:01]
NOT IN, NOT EXISTS 을 사용하셔도 될 것으로 보이는데,
그게 아니라면 self join 으로 풀수도 있을 것으로 보이고...


혹시 이런걸 원하신게 아니시라면 다시 문의 올려주심이...^^;

by Maximus [2013.11.29 13:19:08]

아래 쿼리를 수행하면 제가 원한는 값이 나옵니다.
이렇게 말고 좀 더 효율적인 방법이 없을까 고민중입니다.

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