UPDATE 문에서 문장 의미 해석좀 부탁드립니다. 0 5 1,473

by richard [SQL Query] MSSQL UPDATE [2020.06.08 10:10:17]


안녕하세요.

저희 시스템 중 잠금 기능을 DB로 제어하는 부분이 있는데요. 관련 내용 검색을 잘못 하는지 조회가 되질 않아.... DB 성지 구루비까지 오게 되었습니다.

 

이해가 되지 않는 부분은 볼드처리 하였습니다.
 

-- 해당 쿼리는 mybatis 문법이 포함되어 있습니다.

UPDATE LOCK_TABLE SET

LOCK_MEMBER_SEQ = #{memberSeq}

LOCK_DT = CASE WHEN #{memberSeq} IS NULL 

  THEN LOCK_DT 

  ELSE GETDATE() END 

WHERE 

CASE WHEN #{orginlPprEditSeq} IS NOT NULL AND PHOTO_YN = 'N' 

  THEN ORGINL_PPR_EDIT_SEQ 

  ELSE PPR_EDIT_SEQ END = 

CASE WHEN #{orginlPprEditSeq} IS NOT NULL 

AND PHOTO_YN = 'N' 

  THEN #{orginlPprEditSeq} 

  ELSE #{pprEditSeq} END

 

질문 -

1. UPDATE SET COLUMN 에 LOCK_DT 는 SELECTOR 된 ROW 의 LOCK_DT 를 가져와 다시 업데이트 하는 것인가요?

  - 맞다면 값이 변하지 않을텐데... 

  - 제가 이해한 예는 pprEditSeq 의 값이 일치한 row 의 LOCK_DT 를 업데이트 하는 것이라고 이해하였습니다.

 

2. PHOTO_YN 의 쿼리 실행 순서가 어떻게 될까요?

 - 테이블을 메모리에 올리고 WHERE 절에 조건으로 PK(인덱스라고 표현하는 것일까요?) SCAN으로 SELECT 쿼리를 조회한다고 보면 그냥 다를게 없는 where 절이 되는걸까요?

 

감사합니다!

by 임상준 [2020.06.08 12:31:22]

1. case 구문을 썼으므로 #{memberSeq} 가 널일 경우에는 같은 테이블의 locl_dt 로 업데이트 하고 아니면 GETDATE()  로 업데이트 한다는 뜻으로 보입니다.

2. 질문의 의도를 잘 모르겠습니다. photo_yn 은 그냥 테이블 컬럼 명 입니다. where 절만 봐서는 pk 인지 아닌지의 여부는 알 수 없고 where 절의 내용은 lock_table 의 update 대상을 찾기 위한 조건절로써 select 절의 where 와 쓰임이 동일합니다.


by richard [2020.06.08 13:17:50]

답변 감사합니다!

같은 테이블의 라는 표현은 해당 테이블에서 최종 select 된 하나의 row를 말씀하신건가요?

select 된 index 가 3이라고 가정하고,

3의 index 를 가진 행의 lock_dt 값이 10:10 이면, memberSeq 가 null일 때 10:10 으로 다시 update 하는 로직이 되는건가요?

 


by 임상준 [2020.06.08 13:40:47]

where 절로 추출 한 데이터 집합이 update 대상 집합입니다. set 절에 컬럼명을 사용 할 경우는 update 하려는 행 자체의 컬럼 값을 사용한다는 의미입니다. index, pk 등등의 표현이 어떤 의미인지 잘 모르겠지만, 테이블 구조와 관련된 내용은 질문 내용에서는 알 수 없으므로 답변 드리기 힘듭니다. 나머지는 밑에 마농님 답변도 같이 참조해주시면 될거같습니다.


by 마농 [2020.06.08 13:22:02]

orginlPprEditSeq 값이 입력된 경우와 그렇지 않은 경우 조건을 달리하는 거네요.
2개 분기 조건에 yn 조건은 공통사항이니 밖으로 빼내어 한번만 쓰는게 좋을 듯 하구요.
입력된 memberSeq 가 널일 경우에는 lock_dt 를 업데이트 하지 않겠다는 의미죠.
전반적으로 왜 이런 로직으로 구성되어 있는지는
테이블의 특성 및 각 항목의 의미 및 역할 등을 정확하게 알아야 판단 가능합니다.


by richard [2020.06.08 14:38:54]

임상준 님, 마농 님 답변해주셔서 감사합니다.

도움이 됐습니다!

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