2016-05-10 14 views
0

Ich versuche, zwei ähnliche Tabellen zu vergleichen, die identische Strukturen haben. So führen Sie mir die folgende SQL:Vergleichen von Daten in zwei ähnlichen Tabellen

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

(die Tabellen Spalten: ID, Setting, SettingValue, Timestamp)

Und das Abfrage funktioniert OK, aber ich mag die Ergebnisse, um nur Zeilen beschränken, wobei der G2.SettingValue NULL ist oder sich von G1.SettingValue unterscheidet.

So ändere ich die SQL-oben:

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

JEDOCH diese gibt nur die Zeilen, die die zweite Bedingung erfüllt. Wenn ich es einfach ohne

OR g2.SettingValue Is NULL 

starte ich bekomme überhaupt keine Zeilen. Aber viele Zeilen scheinen diese Abfrage zu erfüllen. Sie erscheinen jedoch nicht.

Diese SQL das Problem veranschaulichen soll:

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') 

Dann laufen:

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

Dann laufen:

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

Versuchen Sie, die zusätzlichen zwei Bedingungen auch für die Join-Bedingung; Stellen Sie sicher, dass Sie passende Klammern haben – techspider

+0

'Aber viele Zeilen scheinen diese Abfrage zu erfüllen ', kümmern Sie sich darum, einige dieser Zeilen zu posten? – Lamak

Antwort

1

Versuchen Sie folgendes:

-- 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

Dies erzeugt auch nur Nullen für g2 – Ron

+0

, das heißt, es gibt keine Tupel mit abweichendem SettingValue und passendem SettingName –

+0

Dies funktioniert. VIELEN DANK!!! – Ron

0

Die folgende Beschreibung ist eine Teilmenge von Werten zuerst erstellen, wo mainTable und comparisonTable unterscheiden sich und führen dann den Join aus, um die Unterschiede anzuzeigen:

with cte(
    select * from mainTable 
    EXCEPT 
    select * from comparisonTable 
) 
select * from cte g1 left join comparisonTable g2 on g2.SettingName=g1.SettingName 
Verwandte Themen