1번 쿼리, 2번 쿼리 눈으로 보면 update뒤에 테이블명 밖에 차이가 없는데 실행시킬때 2개 차이점이 어떻게 되는지 몰르겠습니다
1번 쿼리
update A
set test_aa = 0
from test_db A
inner join test_db B
on A.r_no = B.no
and A.r.gurun = B.gurun
2번 쿼리
update B
set test_aa = 0
from test_db A
inner join test_db B
on A.r_no = B.no
and A.r.gurun = B.gurun
음.. 저도 왜 이런게 되어있는지는 몰르겠습니다
지금 이직하고 코드 분석중인데.. db초보다 보니깐 왜 두개가 있지 하고 궁금해서 질문한거라서요..
밑에 빠진부분은 1,2번 쿼리 동일한데 on에 하나더 있고 where절에 3개 있습니다
1번 빠진 부분을 적어보겠습니다
update A
set test_aa = 0
from test_db A
inner join test_db B
on A.r_no = B.no
and A.r.gurun = B.gurun
and A.ino = B.ino
where A.r_no = '1'
and A.r.gurun = '11'
and A.ino = '101'
1번,2번 쿼리 둘다 where 조건에 A.~ 로 동일합니다
아무런 관계가 없는 단독 코드만 제외라는게 on에서 A.r_no = B.no 이런게 같지 않는경우를 제외한다는 말씀이시죠??
(A.r_no가 '1'이고 B.no가 2일 경우는 제외)
이런경우 말씀하시는거면 데이터 보니깐 같은 경우도 있고 같지 않은 경우도 있습니다
아래처럼 변경해도 될것 같은데.. 확인 좀 해주세요~~
update test_db
set test_aa = 0
r_no <> no
Update 쿼리가 이해가 안갈 때는
쿼리를 그대로 Select 쿼리로 바꾸어 실행해보시면 됩니다.
아래는 이해를 돕기 위한 샘플자료 수행 테스트입니다.
WITH t AS ( SELECT 1 gb, 1 no, 1 r_gb, 0 r_no FROM dual UNION ALL SELECT 1, 2, 1, 1 FROM dual UNION ALL SELECT 1, 3, 1, 1 FROM dual UNION ALL SELECT 1, 4, 1, 3 FROM dual UNION ALL SELECT 1, 5, 1, 0 FROM dual ) -- 1. a(자식) 조회 SELECT a.no FROM t a INNER JOIN t b ON a.r_gb = b.gb AND a.r_no = b.no ; --> 결과 : 2,3,4 --> 누락 : 1,5 <-- 부모없음 -- 2. b(부모) 조회 SELECT b.no FROM t a INNER JOIN t b ON a.r_gb = b.gb AND a.r_no = b.no ; --> 결과 : 1,1,3 <-- 중복발생 --> 누락 : 2,4,5 <-- 자식없음 -- 3. 두개 모두 수행 --> 결과 : 1,2,3,4 --> 누락 : 5 <-- 관계없음
특정 노드가 조건으로 주어지네요.
해당 노드를 부모로 가지는 A 를 구하고 (WHERE a.r_no = '1' ...)
A 의 부모 B 와 연결하고 있습니다. (ON a.r_no = b.no ...)
결국 A 는 특정 노드의 자식이고
결국 B 는 특정 노드 그 자신이 될 것 같네요.
즉 조건으로 주어지는 특정 노드와(2번쿼리) 그 자식까지(1번쿼리) 갱신하는 거네요.
쿼리 두번 날리는 것은 맞는 듯 하나 셀프 조인은 필요 없어 보입니다.
-- 1. 자식 노드 UPDATE test_db SET test_aa = 0 WHERE r_no = '1' AND r_gurun = '11' AND ino = '101' ; -- 2. 해당 노드 UPDATE test_db SET test_aa = 0 WHERE no = '1' AND gurun = '11' AND ino = '101' ;