update 쿼리 2개 차이점 좀 알려주세요 0 7 1,062

by db초보 [DB 기타] mssql [2020.03.02 10:23:27]


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

by 마농 [2020.03.02 12:32:10]

자기 참조 테이블 인 듯 하네요. 계층 구조
A 를 기준으로 참조 대상 B 를 조인하는 셀프조인 이네요.
A 가 자식이라면 B 는 부모가 됩니다.
1번 쿼리는 부모가 있는 자식 갱신
2번 쿼리는 자식이 있는 부모 갱신


by db초보 [2020.03.02 13:35:02]

프로시저 코드보니깐 두개가 같이 있더라요..

1번 쿼리 있고 바로 밑에 2번 쿼리가 있습니다

부모가 있는 자식 갱신

자식이 있는 부모 갱신이라고 하셨는데..

1,2번 쿼리 보면 테이블 똑같고 on으로 연결된것도 똑같으면 1번이든 2번이든 하나만 사용해도 되는건가요??


by 마농 [2020.03.02 13:45:48]

1번은 부모가 없는 자식(최상위)은 누락될 것이고
2번은 자식이 없는 부모(최하위)는 누락될 것입니다.
2개 쿼리 모두 수행시엔 아무런 관계가 없는 단독 코드는 누락되겠네요.
아무런 관계가 없는 단독 코드만 제외하는게 목적일까요?
왜 이런 갱신을 하는지 의문입니다.
혹시 다른 조건이 더 있는데 질문시 누락된 건 아닌지?

특히나 2번 쿼리는 중복자료가 발생되어 중복으로 여러번 갱신되게 됩니다.
부모 자식 관계는 보통 1:다 관계를 가지므로 조인시 부모가 중복되어 나오게 됩니다.


by db초보 [2020.03.02 14:12:02]

음.. 저도 왜 이런게 되어있는지는 몰르겠습니다

지금 이직하고 코드 분석중인데.. 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


by 마농 [2020.03.02 14:00:40]

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  <-- 관계없음

 


by 마농 [2020.03.02 14:43:08]

특정 노드가 조건으로 주어지네요.
해당 노드를 부모로 가지는 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'
;

 


by db초보 [2020.03.02 14:53:20]

고맙습니다~~

한개의 질문에 여러개의 지식을 알아가네요~~

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