2011-12-06 3 views
-1

SQL 서버 2008 표 내에서 복사 기록 : 표SQL : 같은 테이블

내가 미리보기 0 각 레코드를 고유하게 정의하는 방법은 없습니다이 기록에 미리 = 1이 기록을 복사해야
ID DESC  TYP SUBSET VAL1 VAL2 VAL3 VAL4 PReview Country 

1 DESC1 1  1  1.0 1.1 1.2 1.2 0   1 
2 DESC1 1  1  2.0 1.1 1.2 1.2 0   1 
3 DESC1 1  1  1.0 1.1 1.2 1.2 0   1 
4 DESC2 2  1  3.0 2.1 1.7 1.8 0   1 
5 DESC2 2  1  4.0 3.1 1.7 1.9 0   1 
6 DESC2 2  1  5.0 6.1 1.5 1.6 0   1 
13 DESC1 1  1  1.0 1.1 1.2 1.2 1   1 
14 DESC1 1  1  2.0 1.1 1.2 1.2 1   1 
15 DESC1 1  1  1.0 1.1 1.2 1.2 1   1 

16 DESC2 2  1  1.0 6.1 1.7 1.2 1   1 
17 DESC2 2  1  2.0 4.1 6.2 8.2 1   1 
18 DESC2 2  1  1.0 8.1 7.2 1.9 1   1 

. 그것들이 질서 정연한 방식으로 복사 된 것을. 레코드 13을 레코드 1에 복사해야합니다. 레코드 14는 레코드 2에 복사해야합니다. 레코드 15는 레코드 3에 복사해야합니다.

감사합니다.

+2

"각 레코드를 고유하게 정의 할 수있는 방법이 없습니다"... ID 열은 고유합니다. 그렇지 않니 ?? –

+1

미리보기 = 0 및 미리보기 = 1과 동일한 수의 행이 있습니까? –

+1

-1 하찮은 질문 - 아무데도 충분하지 않은 세부 사항, 당신이 무엇을하려고하는지 그리고 알고리즘 작동 방식에 대한 설명이 부족합니다. 'copy into'는 무엇을 수반합니까? 어떤 기록이 어떤 관련 기록에 '복사'되었는지 어떻게 결정하고 있습니까? 'copy into'(복사 후), 원래의 행/대상 행은 어떻게됩니까? –

답변

1

기본 개념은 원본 및 대상 행을 "열거 (enum)"(즉, 인덱스 첨부) 한 다음 인덱스 1이있는 원본 행을 인덱스 1, 인덱스 2가있는 원본 행을 대상 행에 할당하는 것입니다 인덱스 2 등 : 일반 영어

UPDATE TABLE1 
SET 
    [DESC] = SOURCE.[DESC], 
    TYP = SOURCE.TYP, 
    SUBSET = SOURCE.SUBSET, 
    VAL1 = SOURCE.VAL1, 
    VAL2 = SOURCE.VAL2, 
    VAL3 = SOURCE.VAL3, 
    VAL4 = SOURCE.VAL4, 
    PREVIEW = SOURCE.PREVIEW, 
    COUNTRY = SOURCE.COUNTRY 
FROM (
    SELECT DEST_ID, SRC.* 
    FROM 
     (SELECT ID DEST_ID, RANK() OVER (ORDER BY ID) R FROM TABLE1 WHERE PREVIEW = 0) DEST 
     JOIN (SELECT *, RANK() OVER (ORDER BY ID) R FROM TABLE1 WHERE PREVIEW = 1) SRC 
      ON SRC.R = DEST.R 
) SOURCE 
WHERE TABLE1.ID = SOURCE.DEST_ID 

:

  • 행에 인덱스를 첨부 곳 PREVIEW = 0, ID (RANK() OVER (ORDER BY ID))의 순서이다.
  • PREVIEW = 1 인 경우와 동일하게 수행하십시오.
  • 원본을 대상 인덱스와 일치시킵니다 (JOIN ... ON SRC.R = DEST.R).
  • 해당 일치 항목을 기반으로 테이블을 업데이트하십시오. 초기 쿼리 실행 모든 대상 행을 업데이트하지 않습니다와 두 번째 실행는 같은 소스 행으로 이어질 수 -

대상 행의 수는 소스 행의 수보다 작은 경우주의하시기 바랍니다 다른 대상 행 복사됩니다.

사실상 동일한 원본 행을 여러 대상 행에 복사 할 수 있습니다.

+0

@ Branko. 답장과 제안에 감사드립니다. 나는 그것을 시도 할 것이다 ... 그러나 나는 결코 전에 인덱스를 사용하지 않았고 나는 당신의 솔루션을 만들지 않아도되는지 알지 못한다 : – shazia

+0

나는 나의 샘플 데이터를 업데이트했다. 당신의 솔루션은 그것으로 작동 할 것입니다. 한편으로 나는 인덱스를 이해하기 위해 머리를 긁을 것입니다. 고마워. – shazia

+0

@shazia 이미 설명한 설명에주의를 기울이면 내 솔루션이 새로운 테스트 데이터에서 작동하지 않는 이유는 알 수 없습니다. 너는 그것을 실제로 시도 했는가? 그것은 당신이 원하는대로 할 수 있습니까? –

1

당신은, 미리보기 "위에 복사"= 0 기록 레코드를해야하는 경우는 없습니다 :

  • 가 각 2 부 그래서 각 preview = 1 기록을 완전히 복제 preview = 0 기록을
  • 삭제 .

여러분이 묻는 것처럼 들립니다.

+0

제안 사항에 대한 감사의 아담 .. 여기에는 다른 테이블에 링크되어 있으므로 미리보기 = 0 레코드를 삭제할 수 없다. 내가 정체성 컬럼을 필요로하지 않는다면 일했습니다. – shazia