1

new と old を含む 2 つのテーブルがありdatasetます。個々のレコードで何かが起こったかどうかを確認したい。

古いテーブル:

ROW ID  FIELD_A FIELD_B FIELD_C
1   101 A       B       C
2   102 AA      BB      CC
3   103 AAA     BBB     CCC

新しい表:

ROW ID  FIELD_A FIELD_B FIELD_C
711 101 A       B       C
712 102 AAXXXXX BB      CC
713 103 AAA     BBB     CCC

期待される出力:

ROW ID  FIELD_A FIELD_B FIELD_C
712 102 AAXXXXX BB      CC 

で記録の違いを識別できるようにしたいid =102。私の実際の記録は、比較する必要がある多くの列ではるかに大きいことに注意してください。この比較を行う最良の方法は何ですか?

4

6 に答える 6

2

一致する行のみを取得する場合は、次のクエリを使用します

SELECT * FROM newtable INTERSECT SELECT * FROM oldtable

別のレコードのみを取得したい場合は、次のクエリを使用します

SELECT * FROM newtable EXCEPT SELECT * FROM oldtable
于 2013-06-27T07:46:15.553 に答える
0

テーブルの構造が同一であると仮定すると、このクエリは、相違点の A/B 比較を行う各列のクエリを出力します。

SELECT 'SELECT a.' + COLUMN_NAME +
       '     , b.' + COLUMN_NAME +
       '  FROM old_table a' + 
       '     , new_table b ' +
       ' WHERE a.id = b.id ' +
       '   AND a.' + COLUMN_NAME + 
       '    <> b.' + COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_NAME = 'old_table'
   AND COLUMN_NAME <> 'id'

この出力を新しいクエリ ウィンドウにコピーして実行できます。

違いがあるかどうかだけが気になる場合は、EXCEPTベースの答えの方がはるかに簡単で高速です。これにより、実際の違いが何であるかがわかります。

于 2013-06-27T07:53:02.443 に答える
0

新しいテーブルで変更されたレコードを見つけるには、次のクエリを使用します

SELECT * FROM newtable EXCEPT SELECT * FROM oldtable; 

変更される列が確実な場合は、それらの列を で指定しSELECTて、クエリをより効率的にすることができます。

于 2013-06-27T07:57:30.937 に答える
0

クエリを使用することにより、列の値が古いテーブルと一致しない場合、以下は新しいテーブルからのレコードを提供します。クエリにすべての列を追加する必要があります

SELECT N.FIELD_A, N.FIELD_B, N.Field_C FROM NewTable N
LEFT JOIN OldTable O ON 
    O.FIELD_A = N.FIELD_A AND O.FIELD_B = N.FIELD_B AND O.FIELD_C = N.FIELD_C
WHERE O.FIELD_A IS NULL 

テーブルにさらに列がある場合は、両方のテーブルに ModifiedDate のような列を追加してみてください。テーブルに変更が加えられるたびに日時を更新します。この方法では、すべての列を比較する必要はなく、日付のみを比較するだけです。

于 2013-06-27T07:46:39.563 に答える
0
select * from oldtable a inner join newtable b on a.id=b.id
where a.fielda<> b.fielda or a.fieldb<>b.fieldb or  a.fieldc<> b.fieldc
于 2013-06-27T07:56:32.650 に答える