안녕하세요. 공부중인 취준생입니다. 공부하다 도저히 알 곳이 없어 여기에 질문하게 되었습니다.
아래 쿼리는 반, 번호, 점수 테이블이라고 보시면 되는데요
A반의 1번과 2번 3번이 같은 점수인 경우 1번에만 점수를 입력하고 2,3번에는 NULL값으로 놔둔 테이블입니다.
즉 A의 2,3은 50점 A의 5는 70점 이런식입니다.
문제1번의 쿼리는 이해를 했는데(사실 로직은 잘 이해가 안됩니다.)
문제2번의 쿼리는 이해가 안되더라구요.
NULL값이 모두 채워진 테이블에서 seq가 작은 값을 찾아서 NULL로 바꿔준다는 것이 이해가 되지 않습니다.
제가 기본적인 로직이 실행이 어떤식으로 되는지 잘 이해가 되지 않는데 혹시 가능하시다면 문제 2번을 디버깅하듯이 순서대로 설명해주실 수 있는 분이 계시다면 감사하겠습니다.
DROP TABLE IF EXISTS OmitTbl;
CREATE TABLE OmitTbl
(keycol CHAR(8) NOT NULL,
seq INTEGER NOT NULL,
val INTEGER ,
CONSTRAINT pk_OmitTbl PRIMARY KEY (keycol, seq));
INSERT INTO OmitTbl VALUES ('A', 1, 50);
INSERT INTO OmitTbl VALUES ('A', 2, NULL);
INSERT INTO OmitTbl VALUES ('A', 3, NULL);
INSERT INTO OmitTbl VALUES ('A', 4, 70);
INSERT INTO OmitTbl VALUES ('A', 5, NULL);
INSERT INTO OmitTbl VALUES ('A', 6, 900);
INSERT INTO OmitTbl VALUES ('B', 1, 10);
INSERT INTO OmitTbl VALUES ('B', 2, 20);
INSERT INTO OmitTbl VALUES ('B', 3, NULL);
INSERT INTO OmitTbl VALUES ('B', 4, 3);
INSERT INTO OmitTbl VALUES ('B', 5, NULL);
INSERT INTO OmitTbl VALUES ('B', 6, NULL);
문제 1 NULL 값을 해당 값으로 채워주기
UPDATE OmitTbl
SET val = (SELECT T1.val
FROM OmitTBl T1
WHERE OmitTBl.keycol = T1.keycol
AND T1.seq = (SELECT MAX(seq)
FROM OmitTbl T2
WHERE OmitTbl.keycol = T2.keycol
AND OmitTbl.seq > T2.seq
AND T2.val IS NOT NULL))
WHERE val is NULL;
문제 2 (val이 중복인 값은 다시 NULL값으로 변경)
UPDATE OmitTbl
SET val = CASE WHEN val = (SELECT T1.val
FROM OmitTbl T1
WHERE T1.keycol = OmitTbl.keycol
AND T1.seq = (SELECT MAX(seq)
FROM OmitTbl T2
WHERE T2.keycol = OmitTbl.keycol
AND OmitTbl.seq > T2.seq
AND OmitTbl.val = T2.val))
THEN NULL
ELSE val END;
Comment 3
-
지영아빠
2023.03.29 04:17
-
이진우5935
2023.03.29 12:55
댓글 감사합니다. 제가 알기로 서브쿼리에서 하나의 스칼라 값이 나타는 것으로 아는데, 실제로 동작하는건 서브쿼리에서 5->4->3->2->1 이렇게 숫자가 생성되어 하나씩변경시키는 것으로 보이거든요. 이게 어떻게 이렇게 순차적으로 변경되는지 궁금합니다. 반복루프가 도는건 아닐텐데요..
-
지영아빠
2023.03.29 20:10
from table X
where (subquery where aa = X....)
이렇게 될때 상관 서브쿼리라고 하는데요. 상관서브쿼리는 대부분 한줄한줄의 Loop로 동작하게 됩니다.