-1

2つのテーブルとしてMSAccessにインポートした2つのExcelファイルがあります。これらの2つのテーブルは同一ですが、異なる日付にインポートされます。

では、後日更新される行とフィールドを確認するにはどうすればよいですか?どんな助けでも大歓迎です。

4

4 に答える 4

1

挿入されたレコードの検索は簡単です

select * from B where not exists (select 1 from A where A.pk=B.pk)

削除されたレコードの検索も同様に簡単です

select * from A where not exists (select 1 from B where A.pk=B.pk)

更新されたレコードを見つけるのは面倒です。次の厳密なクエリは、null 可能な列があることを前提としており、すべての状況で機能するはずです。

select B.*
  from B
  inner join A on B.pk=A.pk
 where A.col1<>B.col1 or (IsNull(A.col1) and not IsNull(B.col1)) or (not IsNull(A.col1) and  IsNull(B.col1))
    or A.col2<>B.col2 or (IsNull(A.col2) and not IsNull(B.col2)) or (not IsNull(A.col2) and  IsNull(B.col2))
    or A.col3<>B.col3 or (IsNull(A.col3) and not IsNull(B.col3)) or (not IsNull(A.col3) and  IsNull(B.col3))
    etc...

列が NOT NULL として定義されている場合、クエリは非常に単純です。すべての NULL テストを削除するだけです。

列が null 可能であるが、データに表示されない値を識別できる場合は、次のような単純な比較を使用します。

Nz(A.col1,neverAppearingValue)<>Nz(B.col1,neverAppearingValue)
于 2012-06-29T14:49:16.970 に答える
0

これは、次のようなクエリを実行するのと同じくらい簡単であるべきだと思います。

SELECT * 
FROM Table1
    JOIN Table2
         ON Table1.ID = Table2.ID AND Table1.Date != Table2.Date
于 2012-06-29T13:43:00.410 に答える
0
(Select * from OldTable Except Select *from NewTable)
Union All
(Select * from NewTable Except Select *from OldTable)
于 2012-07-16T13:53:26.387 に答える
0

これを行う 1 つの方法は、両方のテーブルのピボットを解除することです。これにより、 、 、 を含む新しいテーブルが得られます。ただし、型を考慮する必要があることに注意してください。

たとえば、次はフィールドの違いを取得します。

with oldt as (select id, col, val
              from <old table> t
              unpivot (val for col in (<column list>)) unpvt
             ),
     newt as (select id, col, val
              from <new table> t
              unpivot (val for col in (<column list>)) unpvit
             )
select *
from oldt full outer join newt on oldt.id = newt.id
where oldt.id is null or newt.id is null

結合による別の方法はかなり面倒です。このバージョンでは、列が追加、削除されたかどうか、および変更された列がある場合はどの列が変更されたかが示されます。

select *
from (select coalesce(oldt.id, newt.id) as id,
             (case when oldt.id is null and newt.id is not null then 'ADDED'
                   when oldt.id is not null and newt.id is null then 'DELETED'
                   else 'SAME'
              end) as stat,
             (case when oldt.col1 <> newt.col1 or oldt.col1 is null and newt.col1 is null
                   then 1 else 0 end) as diff_col1,
             (case when oldt.col2 <> newt.col2 or oldt.col2 is null and newt.col2 is null
                   then 1 else 0 end) as diff_col2,
             ...
      from <old table> oldt full outer join <new table> newt on oldt.id = newt.id
     ) c
where status in ('ADDED', 'DELETED') or
     (diff_col1 + diff_col2 + ... ) > 0

あらゆるデータ型で機能するという利点があります。

于 2012-06-29T14:01:39.713 に答える