아직도 join시에 on에다 조건을 주는것과 where에다 조건을 주는것이 헷갈립니다 1 2 2,061

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 에다 붙이는게 맞는지 궁금합니다!! 

by 제로벅 [2023.06.24 21:17:37]

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테이블에 데이터가 있는 조인조건만 성립 )

 


by 마농 [2023.06.26 10:42:53]

1. 조인조건은 ON 절에
2. 차집합을 구하기 위한 IS NULL 조건은 WHERE 절에(1개 컬럼만 사용해도 됨)
3. 원래 있던 조건도 WHERE 절에
4. 두개 항목으로 조인해도 되나요?
-> 지금 당장은 됩니다.(중복이 없으므로)
-> 다만, 앞으로도 중복이 없으리라는 보장은 없을 듯 합니다.

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