2 つの別々のサーバーに 2 つのデータセットがあります。どちらも、それぞれ 1 列の情報を引き出します。
データセットの 1 つにのみ表示される行の値を示すレポートを作成したいと考えています。
私が読んだことから、レポート側ではなくSQL側でこれを行いたいようです。その方法がわかりません。
それがどのように可能であるかについて誰かが光を当てることができれば、本当に感謝しています。
2 つの別々のサーバーに 2 つのデータセットがあります。どちらも、それぞれ 1 列の情報を引き出します。
データセットの 1 つにのみ表示される行の値を示すレポートを作成したいと考えています。
私が読んだことから、レポート側ではなくSQL側でこれを行いたいようです。その方法がわかりません。
それがどのように可能であるかについて誰かが光を当てることができれば、本当に感謝しています。
この句を使用してNOT EXISTS
、2 つのテーブルの違いを取得できます。
SELECT
Column
FROM
DatabaseName.SchemaName.Table1
WHERE
NOT EXISTS
(
SELECT
Column
FROM
LinkedServerName.DatabaseName.SchemaName.Table2
WHERE
Table1.Column = Table2.Column --looks at equalities, and doesn't
--include them because of the
--NOT EXISTS clause
)
これにより、 にTable1
表示されない の行が表示されTable2
ます。Table2
テーブル名を逆にして、 に表示されないの行を見つけることができますTable1
。
編集:リンクサーバーの場合にどうなるかを示すために編集を行いました。また、両方のテーブルで同時に共有されていないすべての行を表示したい場合は、以下のように試すことができます。
SELECT
Column, 'Table1' TableName
FROM
DatabaseName.SchemaName.Table1
WHERE
NOT EXISTS
(
SELECT
Column
FROM
LinkedServerName.DatabaseName.SchemaName.Table2
WHERE
Table1.Column = Table2.Column --looks at equalities, and doesn't
--include them because of the
--NOT EXISTS clause
)
UNION
SELECT
Column, 'Table2' TableName
FROM
LinkedServerName.DatabaseName.SchemaName.Table2
WHERE
NOT EXISTS
(
SELECT
Column
FROM
DatabaseName.SchemaName.Table1
WHERE
Table1.Column = Table2.Column
)
左結合を使用することもできます。
select a.* from tableA a
left join tableB b
on a.PrimaryKey = b.ForeignKey
where b.ForeignKey is null
このクエリは、対応するレコードが tableB にない tableA のすべてのレコードを返します。
ちょうど 1 つのデータ セットに表示される行が必要で、各テーブルに一致するキーがある場合は、完全外部結合を使用できます。
select *
from table1 t1 full outer join
table2 t2
on t1.key = t2.key
where t1.key is null and t2.key is not null or
t1.key is not null and t2.key is null
where 条件は、1 つだけ一致する行を選択します。
ただし、このクエリの問題は、null を含む列が多数取得されることです。これを修正する 1 つの方法は、SELECT 句で列を 1 つずつ調べることです。
select coalesce(t1.key, t2.key) as key, . . .
この問題を解決する別の方法は、ウィンドウ関数で共用体を使用することです。このバージョンでは、すべての行をまとめて、キーが出現する回数をカウントします。
select t.*
from (select t.*, count(*) over (partition by key) as keycnt
from ((select 'Table1' as which, t.*
from table1 t
) union all
(select 'Table2' as which, t.*
from table2 t
)
) t
) t
where keycnt = 1
これには、値の取得元のテーブルを指定する追加の列があります。また、値が 1 の追加の列 keycnt もあります。複合キーがある場合は、2 つのテーブル間の一致を指定する列のリストに置き換えるだけです。