programing

두 표의 데이터가 정확히 동일한지 확인하는 방법은?

css3 2023. 10. 22. 20:19

두 표의 데이터가 정확히 동일한지 확인하는 방법은?

기본적으로 테이블이 하나 있습니다.original table) 및 다른 테이블에 백업(backup table); 따라서 두 테이블의 스키마는 정확히 같습니다.

처음에 두 테이블(original table그리고.backup table에는 정확히 동일한 데이터 집합이 포함됩니다.어떤 이유로 시간이 지난 후에 데이터셋이 데이터셋에 있는지 확인해야 합니다.original table변경되었습니다.

이를 위해서는 데이터셋을 비교해야 합니다.original table을 상대로backup table.

이라고 original table는 다음 스키마를 가집니다.

create table LemmasMapping (
   lemma1 int,
   lemma2 int,
   index ix_lemma1 using btree (lemma1),
   index ix_lemma2 using btree (lemma2)
)

어떻게 하면 데이터셋 비교를 달성할 수 있습니까?

업데이트: 테이블에 기본 키가 없습니다.단순히 두 ID 간의 매핑을 저장합니다.

Checksum TABLE을 사용해서 결과를 비교하면 됩니다.테이블을 변경하여 실시간 체크섬을 계속 사용할 수 있도록 할 수도 있습니다.

CHECKSUM TABLE original_table, backup_table;

테이블에 기본 키가 필요하지 않습니다.

한 테이블이 다른 테이블보다 작은 것은 신경 쓰지 않고 속성의 차이만 신경 쓴다면 다음과 같습니다.

SELECT * FROM Table1
UNION
SELECT * FROM Table2

두 테이블의 최대 개수보다 큰 레코드를 얻으면 동일한 데이터가 없습니다.

저는 세가지 질문을 작성할 것입니다.

  1. 두 테이블에서 기본 키가 존재하는 행을 픽업하기 위한 내부 조인이지만 다른 열 중 하나 이상의 값에 차이가 있습니다.이렇게 하면 변경된 행이 원래대로 표시됩니다.

  2. 원래 테이블에는 있지만 백업 테이블에는 없는 행을 픽업하기 위한 왼쪽 외부 조인(즉, 원래 행에는 백업에 없는 기본 키가 있음).이렇게 하면 원본에 삽입된 행이 반환됩니다.

  3. 원본에 더 이상 존재하지 않는 백업 행을 선택할 수 있는 오른쪽 외부 조인입니다.이렇게 하면 원본에서 삭제된 행이 반환됩니다.

세 개의 쿼리를 결합하여 하나의 결과 집합을 반환할 수 있습니다.이 작업을 수행한 경우 열을 추가하여 행 유형(업데이트, 삽입 또는 삭제)을 표시해야 합니다.

약간의 노력으로 전체 외부 조인을 사용하여 하나의 쿼리에서 이 작업을 수행할 수 있습니다.외부 조인은 SQL 엔진마다 다르게 동작하므로 주의해야 합니다.조인 절 대신 where 절에 넣는 술어는 때때로 외부 조인을 내부 조인으로 바꿀 수 있습니다.

대부분의 DBMS는 관계형 대수의 Differential 연산을 지원합니다.스노우플레이크에서는 MINUS로 표시됩니다.따라서 다음 코드가 작동합니다.첫 번째 MINUS는 표 1의 모든 요소가 표 2에 있는지 확인합니다.두 번째 MINUS는 표 2의 모든 요소가 표 1에 있는지 확인합니다.쿼리가 0을 반환하면 수학적으로 두 테이블은 완전히 동일합니다.

select count(*) from 
(
 (
  SELECT * FROM Table1
  MINUS
  SELECT * FROM Table2
 )
 UNION ALL
 (
  SELECT * FROM Table2
  MINUS
  SELECT * FROM Table1
 )
)

그러나 SQL Server에서 '예외' 키워드를 사용할 수도 있습니다.

SELECT Col1, Col2, Col3, Col4, Col5 FROM Table_1
EXCEPT
SELECT Col1, Col2, Col3, Col4, Col5 FROM Table_2

쿼리가 행을 반환하는 경우:그들은 동일하지 않습니다.

쿼리가 행을 반환하지 않는 경우:그것들은 아주 똑같은 겁니다.

select count(*) 
from lemmas as original_table 
      full join backup_table using (lemma_id)
where backup_table.lemma_id is null
      or original_table.lemma_id is null
      or original_table.lemma != backup_table.lemma

null에 대한 전체 가입/확인은 추가 또는 삭제 및 변경 사항을 포함해야 합니다.

  • backup.id 이 null = 추가입니다.
  • original.id 이 null = 삭제입니다.
  • null = 변경 안 함

다음과 같이 두 표를 비교해 봅니다.

SELECT 'different' FROM DUAL WHERE EXISTS(
    SELECT * FROM (
        SELECT /*DISTINCT*/ +1 AS chk,a.c1,a.c2,a.c3 FROM a
        UNION ALL
        SELECT /*DISTINCT*/ +1 AS chk,b.c1,b.c2,b.c3 FROM b
    ) c
    GROUP BY c1,c2,c3
    HAVING SUM(chk)<>2
)
UNION SELECT 'equal' FROM DUAL
LIMIT 1;

1: 먼저 표 C1과 C2에 대한 카운트를 가져옵니다.C1과 C2는 같아야 합니다.C1과 C2는 다음 쿼리에서 얻을 수 있습니다.

 select count(*) from table1

C1과 C2가 동일하지 않으면 표는 동일하지 않습니다.

2: 표 DC1과 DC2 모두에 대한 고유 카운트를 찾습니다.DC1과 DC2는 같아야 합니다.구별되는 레코드의 수는 다음 쿼리를 사용하여 찾을 수 있습니다.

select count(*) from (select distinct * from table1)

DC1과 DC2가 동일하지 않으면 표가 동일하지 않습니다.

3: 이제 두 개의 표에서 조합을 수행하여 얻은 기록의 수를 구합니다.U라고 하자. 다음 쿼리를 사용하여 2개의 테이블로 이루어진 유니언의 레코드 수를 구합니다.

 SELECT count (*)
 FROM 
    (SELECT *
    FROM table1
    UNION
    SELECT *
    FROM table2)

두 표에 대한 개별 카운트가 두 표의 결합을 수행하여 얻은 레코드의 수와 같으면 두 표의 데이터가 동일하다고 할 수 있습니다.즉 DC1 = U 및 DC2 = U

아래 논리를 사용하여 어떤 종류의 기본 키가 없고 테이블 내에 중복된 행이 없을 때 두 테이블이 정확히 동일한지 확인하는 다음 방법을 시도하십시오.

1단계 - TABLEA에서 중복 행 검정

한다면SELECT DISTINCT * FROM TABLEA

행 개수가 다음과 같습니다.

SELECT * FROM TABLEA

다음 단계로 가십시오. 그렇지 않으면 이 방법을 사용할 수 없습니다.

2단계 - TABLEB에서 중복 행 검정

한다면SELECT DISTINCT * FROM TABLEB

행 개수가 다음과 같습니다.

SELECT * FROM TABLEB

다음 단계로 넘어가면 이 방법을 사용할 수 없어요

3단계 - 모든 열에 내부 접합 테이블A와 테이블B 연결

아래 쿼리의 행 카운트가 1단계 및 2단계의 행 카운트와 동일한 경우 테이블은 동일합니다.

SELECT
*

FROM
TABLEA

INNER JOIN TABLEA ON
TABLEA.column1 = TABLEB.column1
AND TABLEA.column2 = TABLEB.column2
AND TABLEA.column3 = TABLEB.column3 
--etc...for every column

이 방법은 반드시 여러 데이터 유형에 대해 테스트할 필요는 없으며, VARB와 같이 가입할 수 없는 데이터 유형에서는 작동하지 않을 수도 있습니다.이니셜)

피드백 환영합니다!

MS SQL Server와 함께 작업하는 더 게으르거나 더 많은 SQL 혐오 개발자를 위해 SQL Delta(www.sqldelta.com )를 추천합니다.뛰어난 GUI를 가지고 있으며 빠르고 정확하며 모든 데이터베이스 개체를 분산시키고 필요한 변경 스크립트를 생성 및 실행하며 전체 데이터베이스를 동기화할 수 있습니다.DBA에게는 차선책입니다;-)

레드게이트에서 사용할 수 있는 SQL Compare라는 비슷한 툴이 있다고 생각합니다.Visual Studio(2010) 최신 버전의 일부 버전에도 매우 유사한 도구가 포함되어 있다고 생각합니다.

간편한 해결 방법을 통해 신속한 이점을 얻을 수 있습니다.

SELECT sum(col1), sum(col2) FROM table1
UNION
SELECT sum(col1), sum(col2) FROM table2

출력은 다음과 같습니다.

합(col1) 합(col2)
11111345678 123456789101234
11111123456 123456789101234

다음 항목을 테스트하여 차이점을 확인합니다.

SELECT count(col1), sum(col2) FROM table1 WHERE col1 = 0
UNION
SELECT count(col1), sum(col2) FROM table1 WHERE col1 = 0
카운트(col1) 합(col2)
1234 123456789
345 6543210

또는 group+sum ()를 통해 다른 테이블의 집계 및 순서에서 한 테이블의 집계를 뺀 후 차이를 사용합니다.

자세한 내용은 Postgre에서 확인할 수 있습니다.이 예제와 동일한 SQL case, Postgre에서 테이블의 내용이 동일한지 확인을 참조하십시오.SQL 입니다.

최근에 저는 이렇게 했습니다.

SELECT STRCMP(
(SELECT GROUP_CONCAT(HEX(col1),HEX(col2),HEX(col3),....) FROM table1),
(SELECT GROUP_CONCAT(HEX(col1),HEX(col2),HEX(col3),....) FROM table2)
);

이 방법을 사용하면 두 개의 테이블에서 하나의 속성만 비교할 수도 있습니다.데이터가 동일하지만 레코드 순서가 다를 경우 ' 같지 않음'으로 표시됩니다. 그러면 정렬 후 cat을 통해 추가 확인을 수행할 수 있습니다.

  1. 두 표가 동일한 구조(즉, 동일한 열과 데이터 유형)를 갖는지 확인합니다.
  2. 두 표의 행 개수가 동일한지 확인합니다.그렇지 않으면 표가 동일할 수 없습니다.
  3. 쿼리나 도구를 사용하여 표의 각 행에 있는 데이터를 비교합니다.
  4. 표가 작으면 행을 하나씩 수동으로 비교할 수 있습니다.그렇지 않으면 SQL 조회를 사용하여 테이블을 비교할 수 있습니다.이를 위한 한 가지 방법은 EXPECT 연산자를 사용하여 두 표의 행을 비교하는 것입니다.예를 들어,
SELECT * FROM Table1
EXCEPT
SELECT * FROM Table2

그러면 표 1에는 있지만 표 2에는 없는 행이 반환됩니다.

  1. UNION 연산자를 사용하여 두 표를 비교할 수도 있습니다.예를 들어,
SELECT * FROM Table1
UNION
SELECT * FROM Table2

이렇게 하면 두 테이블에서 중복이 제거된 행 집합이 반환됩니다.이 쿼리에 의해 반환되는 행의 수가 각 테이블의 행의 수와 같으면 테이블에 동일한 데이터가 들어 있습니다.

이러한 쿼리 결과를 비교하면 두 테이블의 데이터가 정확히 동일한지 여부를 확인할 수 있습니다.

행복한 배움!

언급URL : https://stackoverflow.com/questions/2129717/how-to-verify-if-two-tables-have-exactly-the-same-data