1

2 つの別々のサーバーに 2 つのデータセットがあります。どちらも、それぞれ 1 列の情報を引き出します。

データセットの 1 つにのみ表示される行の値を示すレポートを作成したいと考えています。

私が読んだことから、レポート側ではなくSQL側でこれを行いたいようです。その方法がわかりません。

それがどのように可能であるかについて誰かが光を当てることができれば、本当に感謝しています。

4

3 に答える 3

1

この句を使用して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
    )
于 2012-07-13T15:21:48.523 に答える
1

左結合を使用することもできます。

select a.* from tableA a
    left join tableB b
    on a.PrimaryKey = b.ForeignKey
where b.ForeignKey is null

このクエリは、対応するレコードが tableB にない tableA のすべてのレコードを返します。

于 2012-07-13T15:38:18.917 に答える
1

ちょうど 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 つのテーブル間の一致を指定する列のリストに置き換えるだけです。

于 2012-07-13T16:00:42.383 に答える