2009-10-07 1 views
0

테이블 A가 있습니다.이 테이블에는 PK가 없으며 열 값의 조합으로 만 식별 할 수있는 많은 행을 저장합니다. 테이블 A의 데이터를 다른 테이블에서 가져 와서 적절한 일치/처리를 수행하고 테이블 B를 공급하는 절차가 있습니다. 이제 테이블 A의 데이터가 테이블 B에 올바르게 삽입되었는지 어떻게 확인합니까?
SQL Server 2000이므로 EXCEPT는 해결책이 아닙니다. t-sql (sql server2000)의 다른 테이블에서 한 테이블의 데이터를 검색합니까?

어쩌면 일부 절차는 그것이 포함된다 :

  1. 커서 테이블 A에서 행을 가져올 것이다
  2. 은 (적절한 열 일치) B에
  3. 선택합니까하고 일치 행이 있었는지 을 찾았습니다. (일부 데이터가 반환되었습니다) 증가 카운터 (올바르게 전달 된 행의 수 )
  4. 일치하는 행이없는 것으로 확인 된 경우 0 우리가 (나중에 검토를 위해) 임시 테이블에 찾고 있던데이터는

업데이트 : 테이블 C.에 테이블 A에서 모든 행을 넣어하지 않는 테이블 B를 공급 절차 또한 그것은 다른 테이블에서 데이터를 가져와 (C로 부름) B에 넣습니다 (모든 행이 아님). 아마 하나의 커서를 사용하여 A에서 데이터를 B로 확인한 다음 C에서 데이터를 B로 확인하는 다른 커서로 좋은 해결책이 될 것이라고 생각했습니다.

+0

업데이트 후 : 커서를 요구하는 상황이 있다는 것을 배제하지 않지만, 이는 드문 경우이며, 분명히 그 중 하나가 아닙니다. A에서 나온 행이 B에 행해진 이유 또는 B에서 행이되지 않은 이유를 알 수있는 기준이 있어야합니다. B에 있어야하지만 행하지 않은 행을 식별하려면 아래 응답 중 하나를 수정할 수 있습니다. –

+0

그리고 왜 모든 테이블에 PK가 없습니까? 조합 키를 가지고 있다면 최소한 대리 키와 레코드를 정의하는 값의 조합에 대한 고유 인덱스가 있어야합니다.테이블 A가 스테이징 테이블 일 뿐이며 테이블 b로 이동하기 전에 정리를 위해 데이터를 저장하는 데만 사용되는 경우 고유 인덱스가 없으면 벗어날 수 있습니다 (데이터를 아직 정리하지 않은 경우). 레코드를 고유하게 식별 할 수 있으면 매우 유용하기 때문에 이러한 테이블에도 PK를 적용합니다. – HLGEM

+0

표 A와 C는 데이터베이스의 다른 테이블에서 집계 된 데이터가있는 테이블입니다. 표 B는 보고서를 생성하는 데 사용되는보기의 기본 테이블입니다. 이것이 내 결정이 아닌 설계 방법이며, 나는 그것을 바꿀 수 없다. 나는 그것으로 고투 할 필요가있다. – yoosiba

답변

0

당신은 당신의 기준에 따라 일치하지 않는 행에 대한 NOT EXISTS을 할 수

SELECT Columns 
FROM TableA 
Where NOT EXISTS 
(
SELECT 1 
FROM TableB 
WHERE 1=1 
AND TableA.Column1 = TableB.Column1 
AND TableA.Column2 = TableB.Column2 
AND TableA.Column3 = TableB.Column3 
AND TableA.Column4 = TableB.Column4 
) 
당신은 당신의 기준에 따라 경기가 있지만, 나머지가없는 행에 대한 쿼리를 수행 할 수

데이터 일치

SELECT Columns 
FROM TableA 
INNER JOIN TableB 
    ON TableA.Column1 = TableB.Column1 
    AND TableA.Column2 = TableB.Column2 
    AND TableA.Column3 = TableB.Column3 
    AND TableA.Column4 = TableB.Column4 
) 
WHERE TableA.Column11 <> TableB.Column11 
OR TableA.Column12 <> TableB.Column12 
OR TableA.Column13 <> TableB.Column13 
OR TableA.Column14 <> TableB.Column14 

이제 연결이 끊긴 레코드가 모두 있으므로 필요한 로직을 적용 할 수 있습니다.

대부분의 사람들은 CURSOR 기반 답변 대신 SET 기반 응답을 제공합니다. StackOverflow에서 CURSOR를 사용하지 않는 이유에 대해 많은 자료를 찾을 수 있습니다.

0

왜 커서가 필요합니까?

SELECT COUNT(*) --or simply the list of columns 
FROM A LEFT JOIN B 
      ON A.col1 = B.col1 
      AND A.col2 = B.Col2 
      AND .... 
WHERE A.col1 IS NULL AND A.col2 IS NULL 

NULL이 될 가능성이있는 경우 WHERE 절에 여러 개의 열을 지정하여 NULL을 검사해야 할 수 있습니다.

매우 빠르지 않을 수 있습니다. 따라서 색인 구조에 따라 일치하지 않는 행이 있는지 먼저 확인하고 행을 검색해야 할 수 있습니다.

관련 문제