2010-04-08 2 views
6

Wenn ich Ansichten und Schachtelansichten in tieferen Ansichten schreibe, vermisse ich manchmal etwas und am Ende verliere ich Reihen/Daten. Wie kann ich überprüfen, dass Spalten aus zwei verschiedenen Tabellen eine genaue Übereinstimmung der Daten haben?Verifizieren, dass zwei Spalten von zwei verschiedenen Tabellen genau übereinstimmen

Beispiel:

select count(distinct table1.col1) 
    from table1 
where table1.col1 not in (select distinct table2.col1 
          from table2); 

Dies würde die Anzahl der Werte in table1.col1 zurück, die nicht in table2 sind. Ich weiß jedoch nicht, dass dies eine gute Lösung ist, da die Werte von table2.col1, die in table1.col1 nicht vorhanden sind, nicht gezählt werden.

+0

Natürlich ist Verschachtelung Ansichten in der Regel eine schlechte Sache (zumindest in SQL Server). Es scheint in der Entwicklung gut zu sein, aber wenn Sie erst einmal an den Start gehen und viele Datensätze haben, können Sie das System durch Verschachteln von Ansichten zum Absturz bringen. Ich würde diese verschachtelten Ansichten testen, indem ich den Basistabellen fünf Millionen Testdatensätze hinzufüge. – HLGEM

+0

tatsächlich würde ich schließlich die Abfragen neu schreiben, erstellen eine Reihe von verschachtelten Ansichten ist für den Nachweis des Konzepts am Anfang zu überprüfen, dass die Daten so geformt ist, wie ich es will. Ich würde die Ansichten umgestalten, wenn die Datenbank ausgerollt wird. – galford13x

Antwort

3

Verwendung:

SELECT MAX(x.t1_missing_count) AS t1_missing_count, 
     MAX(x.t2_missing_count) AS t2_missing_count 
    FROM (
SELECT COUNT(DISTINCT t1.col1) AS t1_missing_count, 
     NULL AS t2_missing_count 
    FROM TABLE_1 t1 
WHERE t1.col1 NOT IN (SELECT DISTINCT t2.col1 
         FROM TABLE_2 t2) 
UNION ALL 
SELECT NULL, 
     COUNT(DISTINCT t2.col1),   
    FROM TABLE_2 t2 
WHERE t2.col1 NOT IN (SELECT DISTINCT t1.col1 
         FROM TABLE_1 t1)) x 
+0

nicht sicher, warum ich nicht dachte, eine UNION zu verwenden. Also nehme ich es mit einer NOT IN-Klausel Unterabfrage ist ok für eine Operation wie diese? – galford13x

+0

@ galford13x: Ich habe keine Informationen darüber, welche der drei - NOT EXISTS, NOT IN und LINKER JOIN/IS NULL - am effizientesten zu diesem Zeitpunkt ist. –

0
declare @count int, @count2 int 


select @count = count(distinct table1.col1) 
    from table1 
where table1.col1 not in (select distinct table2.col1 
          from table2) 

select @count2 = count(distinct table2.col1) 
    from table2 
where table2.col1 not in (select distinct table1.col1 
          from table1) 

select @count + @count2 
+0

Kann ich mit SQLite interne Variablen wie MS SQL oder MySQL verwenden? – galford13x

+0

Hmm, war das retagged, ich glaube, ich habe für Sql-Typ ... –

+0

Ich glaube nicht, dass es neu markiert wurde, aber es ist markiert SQL :) – galford13x

1
select count(*) from (

select 
table1.col1 from table1 left join table2 on table1.col1 = table2.col2 
where table2.col1 is null 

union 

select table2.col1 from table2 left join table 1 on table2.col1 = table1.col1 
where table1.col1 is null 

) 
6

können Sie zwei verwenden EXCEPT Abfragen (oder Vereinigung davon) zu überprüfen:

SELECT DISTINCT col1 
FROM table1 
EXCEPT 
SELECT DISTINCT col1 
FROM table2 

, die Werte zeigen, die in Tabelle 1 existieren, aber nicht Tabelle2. Führen Sie dann erneut die Tabellennamen für das Gegenteil aus.

+0

Ich mag die Einfachheit. Ich wickle dies mit einem SELECT count() um die Anzahl der Unterschiede zu erhalten. Vielen Dank. – galford13x