2つのテーブルとしてMSAccessにインポートした2つのExcelファイルがあります。これらの2つのテーブルは同一ですが、異なる日付にインポートされます。
では、後日更新される行とフィールドを確認するにはどうすればよいですか?どんな助けでも大歓迎です。
2つのテーブルとしてMSAccessにインポートした2つのExcelファイルがあります。これらの2つのテーブルは同一ですが、異なる日付にインポートされます。
では、後日更新される行とフィールドを確認するにはどうすればよいですか?どんな助けでも大歓迎です。
挿入されたレコードの検索は簡単です
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)
これは、次のようなクエリを実行するのと同じくらい簡単であるべきだと思います。
SELECT *
FROM Table1
JOIN Table2
ON Table1.ID = Table2.ID AND Table1.Date != Table2.Date
(Select * from OldTable Except Select *from NewTable)
Union All
(Select * from NewTable Except Select *from OldTable)
これを行う 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
あらゆるデータ型で機能するという利点があります。