2016-11-30 1 views
0

SOP 애플리케이션이 매우 복잡해졌으며 문서 관리 시스템에 수천 개의 중복 문서가 생겼습니다.SQL 서버에서 중복 행을 업데이트하지만 원본은 그대로 둘 수 있습니까?

SELECT 
    [INVOICE_NO], COUNT(*) 
FROM 
    [dwdata].[dbo].[INVOICES] 
GROUP BY 
    [INVOICE_NO] 
HAVING 
    COUNT(*) > 1 

은 수천 개의 행을 생성합니다. 각 인보이스는 한 번만 저장해야합니다.

INVOICE_NO | COUNT(*) 
2338508  | 2 
2398800  | 3 
2273807  | 2 
2280570  | 4 

각 행은 DWSTOREDATETIME입니다. 예 : 내가하고 싶은 것은 갱신 WORKSORDER가 중복 행에

SELECT 
    [INVOICE_NO], [WORKSORDER], [DWSTOREDATETIME] 
FROM 
    [dwdata].[dbo].[INVOICES] 
WHERE 
    [INVOICE_NO] = 2338508 

2338508 | 1571105 | 2015-11-16 13:52:41.910 
2338508 | 1571105 | 2015-10-27 07:50:59.970 

그러한 내가 존재하지 않는 알고 999999로 이루어져 뭔가 (가장 오래된를 떠나). 그런 다음 문서 관리 시스템 삭제 워크 플로 모듈을 사용하여 삭제할 수 있습니다.

+0

'SET WORKSORDER = ROW_NUMBER() (INVOICE_NO ORDER BY DWSTOREDATETIME BY PARTITION)'그때,/CTE를 하위 쿼리 업데이트 할 RN했습니다. –

답변

2

당신은 CTE를 사용할 수 있습니다, 그것은 간단합니다

WITH CTE AS 
(
    SELECT t.*, RN = ROW_NUMBER() OVER (PARTITION BY INVOICE_NO ORDER BY DWSTOREDATETIME ASC) 
    FROM dbo.TableName t 
) 
UPDATE CTE SET WORKSORDER = 999999 WHERE RN > 1 

당신은 당신이 당신은 아래와 같은 중복 레코드를 업데이트 할 수 있습니다 사용을 SELECT * FROM CTE WHERE RN > 1

+0

제안 된대로 'SELECT * FROM CTE'를 사용하여 테스트했으며 데이터베이스에 한 번만 존재하는'INVOICE_NO'가 나열되어 있습니까? – user6888062

+0

@ user6888062 : 물론 'UPDATE'와 동일한 필터를 적용해야합니다. 미안하지만 포함시키지 않았습니다. 그래서'SELECT * FROM CTE WHERE RN> 1'입니다. 'RN = 1 '을 가진 행은 각'INVOICE_NO' 그룹 중 가장 오래된 행입니다. 필터를 적용하지 않으면 중복 번호가없는 그룹을 찾을 수도 있습니다. –

+0

분명히, 나쁘다. 고마워. 이것은 내가 필요로하고 순간에 실행되는 것 같다! – user6888062

0

를 업데이트하려고하는지 확인합니다. update 문을 여러 번 실행하려면 쿼리에서 partition 절에 [WORKSORDER] 열 이름을 추가해야 업데이트 문에서 불필요한 레코드가 생기지 않도록해야합니다.

UPDATE A SET WORKSORDER=999999 
FROM 
(
SELECT 
    [INVOICE_NO],WORKSORDER, ROW_NUMBER() OVER(PARTITION BY INVOICE_NO ORDER BY DWSTOREDATETIME) RNO 
FROM 
    [DWDATA].[DBO].[INVOICES] 
)A 
WHERE A.RNO>1