2016-05-10 19 views
0

同じ構造を持つ2つの同様のテーブルを比較しようとしています。だから私は、次のSQLを実行します。2つの同様のテーブルのデータを比較する

select * from mainTable g1 left join comparisonTable g2 on g2.SettingName=g1.SettingName 

(テーブルのカラムは次のとおりです。ID、SettingName、SettingValue、タイムスタンプ)

そして、そのクエリはOKに動作しますが、私は唯一のショーの行に結果を制限したいと思いますここで、G2.SettingValueはNULLであるか、またはG1.SettingValueとは異なります。

だから私はに上記のSQLを修正する:しかし、これが唯一の第二の条件を満たした行を返す

select * from mainTable g1 left join comparisonTable g2 on g2.SettingName=g1.SettingName where g1.SettingValue <> g2.SettingValue OR g2.SettingValue Is NULL 

。私はそれを実行していない場合

OR g2.SettingValue Is NULL 

私は全く行を取得しません。しかし、多くの行はこのクエリを満たすようです。しかし、彼らは現れません。

このSQLは、問題を説明する必要があります

create table mainTable ([ID] [int] IDENTITY(1,1) NOT NULL, [settingname] [varchar](200) NULL, [settingvalue] [varchar](200)) 
create table comparisonTable ([ID] [int] IDENTITY(1,1) NOT NULL, [settingname] [varchar](200) NULL, [settingvalue] [varchar](200)) 
insert into maintable(SettingName, SettingValue) Values ('SettingName1','one'),('SettingName2','two'),('SettingName3','three') 
insert into comparisonTable(SettingName, SettingValue) Values ('SettingName1','one'),('SettingName2','two'),('SettingName3','three') 

次に実行します。

select * from mainTable g1 full outer join comparisonTable g2 on g2.SettingName=g1.settingName 

を次に実行します。

insert into mainTable(SettingName, SettingValue) Values ('SettingName4','four') 
+0

試し結合条件にも追加の二つの条件を追加します。 – techspider

+0

'しかし、多くの行がこのクエリを満たしているようです '、それらの行のいくつかを投稿するように気をつけますか? – Lamak

答えて

1

これを試してみてください:

-- differing values  
SELECT g1.* 
, g2.SettingValue as g2SettingValue 
FROM mainTable g1 
INNER JOIN comparisonTable g2 
ON g1.SettingName = g2.SettingName 
AND g1.SettingValue <> g2.SettingValue 
UNION ALL 
-- missing matches 
SELECT g1.* 
, NULL 
FROM mainTable g1 
WHERE NOT EXISTS (
    SELECT 1 
    FROM comparisonTable g2 
    WHERE g1.SettingName = g2.SettingName 
+0

これはg2 – Ron

+0

のnullも生成します。これは、逸脱したSettingValueと一致するSettingNameのタプルがないことを意味します。 –

+0

これは機能します。感謝!!! – Ron

0

以下は、最初の値のサブセット、mainTableを作成する必要がありますcomparisonTableが異なる場合は、結合を実行して相違点を表示します。

with cte(
    select * from mainTable 
    EXCEPT 
    select * from comparisonTable 
) 
select * from cte g1 left join comparisonTable g2 on g2.SettingName=g1.SettingName 
関連する問題