데이터베이스 개발자 질문과 답변 게시판
문서번호 'e100000001' 가 최초 생성되고
문서가 변경되면 New_key에 새로 'e100000002'이 생성되고 종전번호 'e100000001' 가 old_key로 저장됩니다.
만약 이런 변경이 10여차례발생할 경우 아래처럼 해봤는데 잘 안되네요.
효율적인 방법을 알려주세요.
CREATE TABLE TEST_DHK (NEW_KEY VARCHAR(10),OLD_KEY VARCHAR(10))
INSERT TEST_DHK
SELECT 'E230798001','' UNION ALL
SELECT 'E230798002','E230798001' UNION ALL
SELECT 'E230796003','E230798002' UNION ALL
SELECT 'E230798004','E230796003' UNION ALL
SELECT 'E230796005','E230798004' UNION ALL
SELECT 'E230798006','E230796005' UNION ALL
SELECT 'E230798007','E230798006' UNION ALL
SELECT 'E230796008','E230798007' UNION ALL
SELECT 'E230798009','E230796008' UNION ALL
SELECT 'E230798010','E230798009' UNION ALL
SELECT 'E230798011','' UNION ALL
SELECT 'E230798012','E230798010'
SELECT * FROM TEST_DHK
WHERE OLD_KEY!=''
AND OLD_KEY IS NOT NULL
DECLARE @C_KEY BIGINT
DECLARE @O_KEY BIGINT
SELECT @C_KEY = convert(Bigint, Substring('E230798012',2, 9))
SELECT @O_KEY = convert(Bigint, Substring(OLD_KEY,2, 9)) FROM TEST_DHK WHERE NEW_KEY = 'E'+CONVERT(VARCHAR, @C_KEY)
WHILE (@C_KEY) > @O_KEY
BEGIN
PRINT @C_KEY
PRINT @O_KEY
IF (SELECT OLD_KEY FROM TEST_DHK WHERE NEW_KEY = 'E'+CONVERT(VARCHAR, @C_KEY)) = ''
BREAK
ELSE
SELECT NEW_KEY, OLD_KEY
FROM TEST_DHK
WHERE NEW_KEY = 'E'+CONVERT(VARCHAR, @O_KEY)
SELECT @C_KEY = convert(Bigint, Substring(NEW_KEY,2, 9)) FROM TEST_DHK WHERE NEW_KEY = 'E'+CONVERT(VARCHAR, @O_KEY)
SELECT @O_KEY = convert(Bigint, Substring(OLD_KEY,2, 9)) FROM TEST_DHK WHERE NEW_KEY = 'E'+CONVERT(VARCHAR, @O_KEY)
CONTINUE
END
부탁드리겠습니다. 고수님들 ^^
Comment 4
-
누리블루
2012.12.21 15:21
-
진윤호
2012.12.21 15:37
CREATE TABLE #TBL(
NEW_KEY NVARCHAR(20) NOT NULL DEFAULT '',
OLD_KEY NVARCHAR(20) NOT NULL DEFAULT '',
)
INSERT INTO #TBL SELECT NEW_KEY,OLD_KEY FROM (SELECT 'E230798001' AS NEW_KEY,'' AS OLD_KEY UNION ALL
SELECT 'E230798002','E230798001' UNION ALL
SELECT 'E230796003','E230798002' UNION ALL
SELECT 'E230798004','E230796003' UNION ALL
SELECT 'E230796005','E230798004' UNION ALL
SELECT 'E230798006','E230796005' UNION ALL
SELECT 'E230798007','E230798006' UNION ALL
SELECT 'E230796008','E230798007' UNION ALL
SELECT 'E230798009','E230796008' UNION ALL
SELECT 'E230798010','E230798009' UNION ALL
SELECT 'E230798011','' UNION ALL
SELECT 'E230798012','E230798010') AS T
UPDATE #TBL SET OLD_KEY=NEW_KEY WHERE NEW_KEY='E230798002'
UPDATE #TBL SET NEW_KEY='E'+CONVERT(NVARCHAR,(CONVERT(BIGINT,REPLACE((SELECT TOP 1 MAX(NEW_KEY) AS NEW_KEY FROM #TBL),'E',''))+1)) WHERE OLD_KEY='E230798002'
SELECT * FROM #TBL
요론걸 원하시는 건지;;
-
건우아빠
2012.12.21 23:54
질문 내용을 보면 무엇을 하실지가 이해하기가 힘들었는데 .....
질문 제목을 아시고자 하시는거죠..
E230798001 의 문서가 변경되면서~ 'E230798010' 까지 번호로 변경이 되었다가
새로운 문서 'E230798011 이 발생이되고
E230798001 문서에서 변경이된 E230798010' 문서가 'E230798012'로 변경이된 내용이라는거죠 ?
이건 재귀 쿼리를 이용하시는게 가장 쉽게 하실수 있습니다.
new와 old를 부모자식관계로 보시면 쉽게 이해가 가실듯 합니다.
-
건우아빠
2012.12.22 00:06
DECLARE @NEW_KEY VARCHAR(10)
SET @NEW_KEY = 'E230798010';
WITH RES_Subtree(NEW_KEY, OLD_KEY, lvl)
AS
(
SELECT NEW_KEY, OLD_KEY, 0
FROM TEST_DHK
WHERE NEW_KEY = @NEW_KEY
UNION all
SELECT e.NEW_KEY, e.OLD_KEY, es.lvl+1
FROM TEST_DHK AS e
JOIN RES_Subtree AS es
ON e.NEW_KEY = es.OLD_KEY
)
SELECT NEW_KEY , OLD_KEY -- TOP 1으로하시면최소발생문서번호...
FROM RES_Subtree
ORDER BY LVL DESC;
최초값만 나와도 되구요.
관련된 리스트가 쭉 나와도 될 것 같은데 잘 안되는군요....