by null00 [SQL Query] [2023.06.23 11:14:45]
select username, userbirth, pay, item from payhistory where cate_cd = 'shopping'
이라는 쿼리문이 있는데요!
여기서 아래의 쿼리문에 있는 user를 제외시키고싶습니다.
select username, userbirth from blackuserlist where category = 'shop' and version = '2023'
(참고로 userid같은 고유값이 없는 상태여서 username+userbirth 로 검색하니 중복없이 모두 한사람씩 나오더라구요. 그래서 그냥 username+userbirth를 on 조건으로 쓰려고 하는데요... 괜찮을까요..??)
아래와 같이 쿼리문을 짤 예정인데요...
select * from payhistory a left outer join blackuserlist b on a.username = b.username and a.userbirth = b.userbirth
and b.username is null and b.userbirth is null <-위 2개 조건으로 추가해서 차집합이 되게함...
(이렇게 하는게 맞는지도 궁금한데요ㅠ)
payhistory와 blackuserlist 에 있던 조건문
where cate_cd = 'shopping' 와
where category = 'shop' and version = '2023'
이 2개는 on에다가 붙여야할지 아니면 where 에다 붙이는게 맞는지 궁금합니다!!
select * from payhistory a left outer join blackuserlist b on a.username = b.username and a.userbirth = b.userbirth
and b.username is null and b.userbirth is null
=> 이렇게 쿼리하면 b 테이블의 username, userbirth 가 null 인 데이터만 아웃터 조인으로 b 테이블을 가져오는 것이므로 on 절의 컬럼과 중복되어 a 테이블만 나옵니다. b 테이블의 컬럼은 모두 null로 나옴.
따라서, where 에 is null 조건을 넣어야 b 테이블에 없는 데이터만 추출할 수 있습니다. (흔히 하는 방법)
2번째 질문에서
a 테이블의 조건은 where 오면 됩니다. 통상적으로 ~
그러나 a테이블의 조건이든 b테이블의 조건이든
on 절은 데이터를 필터링 하는 것은 아니며 , 해당 조건의 인스턴스(행)만 아웃터조인을 하게 되고 ,
나머지 a 테이블의 데이터와 조인되는 b테이블의 값은 모두 null 이 됩니다.
where 에 a 테이블의 컬럼 필터조건이 있을 경우, a테이블의 값을 필터링 하여 출력하고
b 테이블의 컬럼이 필터조건일 경우에는 innert join 과 같은 결과가 됩니다.
( outer join 해서 b테이블의 데이터가 나왔는데, b 테이블을 필터하므로 결과적으로 b테이블에 데이터가 있는 조인조건만 성립 )