SQL vergleicht Daten aus zwei Tabellen

86

Ich habe 2 Tabellen TableAund TableBdie haben das gleiche Format der Spalte zum Beispiel beide Tabellen TableAund TableBSpalten

A B C D E F 

wobei A und B die Primärschlüssel sind.

So schreiben Sie SQL, um zu überprüfen, ob TableAund TableBmit denselben Primärschlüsseln in jeder Spalte genau der gleiche Wert enthalten ist.

Dies bedeutet, dass diese beiden Tabellen genau dieselben Daten enthalten.

nikky
quelle

Antworten:

79

Sie sollten in der Lage sein, "MINUS" oder "EXCEPT" zu verwenden, abhängig von der von Ihrem DBMS verwendeten SQL-Variante.

select * from tableA
minus
select * from tableB

Wenn die Abfrage keine Zeilen zurückgibt, sind die Daten genau gleich.

Dietbuddha
quelle
5
Hervorragender Vorschlag. Ich denke jedoch, dass dies möglicherweise nicht funktioniert, wenn Tabelle B über zusätzliche Zeilen verfügt. Daher möchten Sie möglicherweise zusätzlich die Anzahl der Zeilen vergleichen.
jzd
5
Anders herum. Es wird nicht funktionieren, wenn tableAzusätzliche Zeilen vorhanden sind. Sie würden brauchen, (A EXCEPT B) INTERSECT (B EXCEPT A)ich würde vermuten, dass dies viel weniger effizient wäre als ein Moor-Standard-Join.
Martin Smith
die Abfrage gibt zwei Ergebnismengen zurück?
BuZz
Diese Abfrage gibt gegebenenfalls Zeilen mit NULL zurück.
Reeya Oberoi
5
@Franklin - Nein, es sollte nur eine Ergebnismenge zurückgegeben werden. Wenn Sie zwei bekommen, verwenden Sie EXCEPT anstelle von MINUS.
MTS
56

Verwenden von Vergleichsoperatoren:

SELECT * FROM TableA
UNION 
SELECT * FROM TableB
EXCEPT 
SELECT * FROM TableA
INTERSECT
SELECT * FROM TableB;

Wechseln Sie EXCEPTzu MINUSfür Oracle.

Etwas wählerischer Punkt: Das Obige hängt von der Priorität des Operators ab, die laut SQL-Standard implementierungsabhängig ist, also YMMV. Es funktioniert für SQL Server, für die folgende Priorität besteht:

  1. Ausdrücke in Klammern
  2. INTERSECT
  3. EXCEPTund UNIONvon links nach rechts ausgewertet.
eines Tages, wenn
quelle
Für Oracle müssen Sie Klammern um die UNION, Klammern um die INTERSECT verwenden und (wie angegeben) EXCEPT durch MINUS ersetzen. HTH.
Doug Clutter
19

Dietbuddha hat eine schöne Antwort. In Fällen, in denen Sie kein MINUS oder EXCEPT haben, besteht eine Option darin, alle Verbindungen zwischen den Tabellen herzustellen, mit allen Spalten zu gruppieren und sicherzustellen, dass zwei von allem vorhanden sind:

SELECT col1, col2, col3
FROM
(SELECT * FROM tableA
UNION ALL  
SELECT * FROM tableB) data
GROUP BY col1, col2, col3
HAVING count(*)!=2
jzd
quelle
Ich habe versucht, dies zu verwenden (ich habe es aus Jeffs SQL Server-Blog erhalten ), möchte jedoch beide Zeilen aus Tabelle A und Tabelle B auflisten, damit ich die Unterschiede in den Zeilen visuell erkennen kann. Würde es Ihnen etwas ausmachen zu erklären, wie das geht?
Emmanuel F
@Agent, das klingt nach einer separaten Frage. Ich würde vorschlagen, es aufzulisten, damit andere es sehen, und nicht nur einen Kommentar hier.
jzd
Getan. Und fertig. Vergleichen der Werte von 2 Tabellen und Auflisten der unterschiedlichen Zeilen . Hoffentlich bekomme ich tolle Ergebnisse. :)
Emmanuel F
Dies funktioniert gut in eingeschränkten SQL-Umgebungen wie Visual FoxPro, danke!
Kit Roed
1
Ich überprüfe dies nur. Erwähnenswert ist, dass die Primärschlüssel eindeutige Datensätze in den Tabellen gewährleisten. Wenn eine Tabelle (oder Abfrage) doppelte Zeilen enthalten könnte, wird DISTINCT/ GROUP BYfür die Unterabfragen in der Union vorgeschlagen, um sicherzustellen, dass nur ein Datensatz pro Tabelle vorhanden ist. Andernfalls könnte Tabelle A 2 Datensätze haben und Tabelle B könnte 0 haben und die HAVING-Bedingung nicht erfüllen.
Vol7ron
8
SELECT c.ID
FROM clients c
WHERE EXISTS(SELECT c2.ID 
FROM clients2 c2
WHERE c2.ID = c.ID);

Gibt alle IDs zurück, die in beiden Tabellen die GLEICHEN sind. Um die Unterschiede zu erhalten, ändern Sie EXISTS in NOT EXISTS.

imiz
quelle
3

Ich habe das Skript von einem Tag an geändert, um auch zu zeigen, aus welcher Tabelle jeder Eintrag stammt.

DECLARE @table1 NVARCHAR(80)= 'table 1 name'
DECLARE @table2 NVARCHAR(80)= 'table 2 name'
DECLARE @sql NVARCHAR (1000)

SET @sql = 
'
SELECT ''' + @table1 + ''' AS table_name,* FROM
(
SELECT * FROM ' + @table1 + '
EXCEPT
SELECT * FROM ' + @table2 + '
) x

UNION 

SELECT ''' + @table2 + ''' AS table_name,* FROM 
(
SELECT * FROM ' + @table2 + '
EXCEPT
SELECT * FROM ' + @table1 + '
) y
'

EXEC sp_executesql @stmt = @sql
Robert Sievers
quelle
2

Um den Vorgang abzuschließen, muss ein Prozess, der mit der Ausnahme-Methode gespeichert wurde, um 2 Tabellen zu vergleichen und das Ergebnis in derselben Tabelle mit 3 Fehlerstatus zu liefern. ADD, DEL, GAP-Tabelle muss dieselbe PK haben. Sie deklarieren die 2 zu vergleichenden Tabellen und Felder von 1 oder beiden Tabellen

Verwenden Sie einfach wie folgt ps_TableGap 'tbl1', 'Tbl2', 'fld1, fld2, fld3', 'fld4'fld5'fld6' (optional)

/****** Object:  StoredProcedure [dbo].[ps_TableGap]    Script Date: 10/03/2013 16:03:44 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:       Arnaud ALLAVENA
-- Create date: 03.10.2013
-- Description: Compare tables
-- =============================================
create PROCEDURE [dbo].[ps_TableGap]
    -- Add the parameters for the stored procedure here
    @Tbl1 as varchar(100),@Tbl2 as varchar(100),@Fld1 as varchar(1000), @Fld2 as varchar(1000)= ''
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.

    SET NOCOUNT ON;
--Variables
--@Tbl1 = table 1
--@Tbl2 = table 2
--@Fld1 = Fields to compare from table 1
--@Fld2 Fields to compare from table 2
Declare @SQL varchar(8000)= '' --SQL statements
Declare @nLoop int = 1 --loop counter
Declare @Pk varchar(1000)= '' --primary key(s) 
Declare @Pk1 varchar(1000)= '' --first field of primary key
declare @strTmp varchar(50) = '' --returns value in Pk determination
declare @FldTmp varchar (1000) = '' --temporarily fields for alias calculation

--If @Fld2 empty we take @Fld1
--fields rules: fields to be compare must be in same order and type - always returns Gap
If @Fld2 = '' Set @Fld2 = @Fld1

--Change @Fld2 with Alias prefix xxx become _xxx 
while charindex(',',@Fld2)>0
begin
    Set @FldTmp = @FldTmp + (select substring(@Fld2,1,charindex(',',@Fld2)-1) + ' as _' + substring(@Fld2,1,charindex(',',@Fld2)-1) + ',')
    Set @Fld2 = (select ltrim(right(@Fld2,len(@Fld2)-charindex(',',@Fld2))))
end
Set @FldTmp = @FldTmp + @Fld2 + ' as _' + @Fld2
Set @Fld2 = @FldTmp

--Determinate primary key jointure
--rule: same pk in both tables
Set @nLoop = 1
Set @SQL = 'Declare crsr cursor for select COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = '''
 + @Tbl1 + ''' or TABLE_SCHEMA + ''.'' + TABLE_NAME = ''' + @Tbl1 +  ''' or TABLE_CATALOG + ''.'' + TABLE_SCHEMA + ''.'' + TABLE_NAME = ''' + @Tbl1 
 + ''' order by ORDINAL_POSITION'
exec(@SQL)
open crsr 
fetch next from crsr into @strTmp
while @@fetch_status = 0
begin 
    if @nLoop = 1 
    begin 
        Set @Pk = 's.' + @strTmp + ' = b._' + @strTmp
        Set @Pk1 = @strTmp
        set @nLoop = @nLoop + 1 
    end 
    Else
    Set @Pk = @Pk + ' and s.' + @strTmp + ' = b._' + @strTmp
fetch next from crsr into @strTmp 

end 
close crsr
deallocate crsr

--SQL statement build
set @SQL = 'select case when s.' + @Pk1 + ' is null then ''Del'' when b._' + @Pk1 + ' is null then ''Add'' else ''Gap'' end as TypErr, '''
set @SQL = @SQL + @Tbl1 +''' as Tbl1, s.*, ''' + @Tbl2 +''' as Tbl2 ,b.* from (Select ' + @Fld1 + ' from ' + @Tbl1
set @SQL = @SQL + ' EXCEPT SELECT ' + @Fld2 + ' from ' + @Tbl2 + ')s full join (Select ' + @Fld2 + ' from ' + @Tbl2 
set @SQL = @SQL + ' EXCEPT SELECT ' + @Fld1 + ' from ' + @Tbl1 +')b on '+ @Pk 

--Run SQL statement
Exec(@SQL)
END
Arnaud ALLAVENA
quelle
1

Verbesserung der Antwort von Dietbuddha ...

select * from
(
    select * from tableA
    minus
    select * from tableB
)
union all
select * from
(
    select * from tableB
    minus
    select * from tableA
)
IanMc
quelle
1

Sie können Unterschiede von 2 Tabellen mithilfe der Kombination aus Einfügen aller und vollständiger äußerer Verknüpfung in Oracle feststellen. In SQL können Sie die Unterschiede über eine vollständige äußere Verknüpfung extrahieren, aber es scheint, dass das Einfügen von all / first in SQL nicht vorhanden ist! Daher müssen Sie stattdessen die folgende Abfrage verwenden:

select * from A
full outer join B on
A.pk=B.pk
where A.field1!=B.field1
or A.field2!=B.field2 or A.field3!=B.field3 or A.field4!=B.field4 
--and A.Date==Date1

Obwohl die Verwendung von 'OR' in der where-Klausel nicht empfohlen wird und normalerweise zu einer geringeren Leistung führt, können Sie die obige Abfrage dennoch verwenden, wenn Ihre Tabellen nicht massiv sind. Wenn es ein Ergebnis für die obige Abfrage gibt, sind es genau die Unterschiede von 2 Tabellen basierend auf dem Vergleich der Felder 1,2,3,4. Um die Abfrageleistung zu verbessern, können Sie sie auch nach Datum filtern (überprüfen Sie den kommentierten Teil).

user3665906
quelle
1

Quelle: Verwenden Sie NATURAL FULL JOIN, um zwei Tabellen in SQL von Lukas Eder zu vergleichen

Cleverer Ansatz NATURAL FULL JOINzur Erkennung derselben / unterschiedlicher Zeilen zwischen zwei Tabellen.

Beispiel 1 - Statusflag:

SELECT t1.*, t2.*, CASE WHEN t1 IS NULL OR t2 IS NULL THEN 'Not equal' ELSE 'Equal' END
FROM t1
NATURAL FULL JOIN t2;

Beispiel 2 - Zeilen filtern

SELECT *
FROM (SELECT 't1' AS t1, t1.* FROM t1) t1 
NATURAL FULL JOIN (SELECT 't2' AS t2, t2.* FROM t2) t2 
WHERE t1 IS NULL OR t2 IS NULL -- show differences
--WHERE  t1 IS NOT NULL AND t2 IS NOT NULL    -- show the same

db <> Geigen-Demo

Lukasz Szozda
quelle
0
    SELECT unnest(ARRAY[1,2,2,3,3]) 
    EXCEPT
    SELECT unnest(ARRAY[1,1,2,3,3])
UNION
    SELECT unnest(ARRAY[1,1,2,3,3])
    EXCEPT
    SELECT unnest(ARRAY[1,2,2,3,3])

Ergebnis ist null, aber die Quellen sind unterschiedlich!

Aber:

(
    SELECT unnest(ARRAY[1,2,2,3])
    EXCEPT ALL
    SELECT unnest(ARRAY[2,1,2,3])
)
UNION
(
    SELECT unnest(ARRAY[2,1,2,3])
    EXCEPT ALL
    SELECT unnest(ARRAY[1,2,2,3])
)

funktioniert.

Kamil Valenta
quelle
0

Ich hatte das gleiche Problem in SQL Server und schrieb dieses T-SQL-Skript, um den Prozess zu automatisieren (tatsächlich ist dies die verwässerte Version, meine hat alle Unterschiede für eine einfache Berichterstellung in eine einzige Tabelle geschrieben).

Aktualisieren Sie 'MyTable' und 'MyOtherTable' auf die Namen der Tabellen, die Sie vergleichen möchten.

DECLARE @ColName varchar(100)
DECLARE @Table1 varchar(100) = 'MyTable'
DECLARE @Table2 varchar(100) = 'MyOtherTable'


IF (OBJECT_ID('tempdb..#col') IS NOT NULL) DROP TABLE #col
SELECT  IDENTITY(INT, 1, 1) RowNum , c.name
INTO    #col
FROM    SYS.Objects o 
        JOIN SYS.columns c on o.object_id = c.object_id
WHERE   o.name = @Table1 AND NOT c.Name IN ('List','Columns','YouWantToIgnore')

DECLARE @Counter INT = (SELECT MAX(RowNum) FROM #col)

    WHILE @Counter > 0

        BEGIN
            SET @ColName = (SELECT name FROM #Col WHERE RowNum= @Counter)
                EXEC ('SELECT  t1.Identifier
                        ,t1.'+@ColName+' AS '+@Table1+@ColName+'
                        ,t2.'+@ColName+' AS '+@Table2+@ColName+'
                FROM    '+@Table1+' t1
                        LEFT JOIN '+@Table2+' t2 ON t1.Identifier = t2.Identifier 
                WHERE   t1.'+@ColName+' <> t2.'+@ColName)
            SET @Counter = @Counter - 1 
        END
Cyndi Baker
quelle
0

Ich habe dies geschrieben, um die Ergebnisse einer ziemlich unangenehmen Ansicht zu vergleichen, die ich von Oracle auf SQL Server portiert habe. Es werden zwei temporäre Tabellen, #DataVariances und #SchemaVariances, erstellt, mit Unterschieden in (Sie haben es erraten) den Daten in den Tabellen und dem Schema der Tabellen selbst.

Es erfordert, dass beide Tabellen einen Primärschlüssel haben, aber Sie können ihn mit einer Identitätsspalte in tempdb ablegen, wenn die Quelltabellen keinen haben.

declare @TableA_ThreePartName nvarchar(max) = ''
declare @TableB_ThreePartName nvarchar(max) = ''
declare @KeyName nvarchar(max) = ''

/***********************************************************************************************

    Script to compare two tables and return differneces in schema and data.

    Author: Devin Lamothe       2017-08-11

***********************************************************************************************/
set nocount on

-- Split three part name into database/schema/table
declare @Database_A nvarchar(max) = (
    select  left(@TableA_ThreePartName,charindex('.',@TableA_ThreePartName) - 1))
declare @Table_A nvarchar(max) = (
    select  right(@TableA_ThreePartName,len(@TableA_ThreePartName) - charindex('.',@TableA_ThreePartName,len(@Database_A) + 2)))
declare @Schema_A nvarchar(max) = (
    select  replace(replace(@TableA_ThreePartName,@Database_A + '.',''),'.' + @Table_A,''))

declare @Database_B nvarchar(max) = (
    select  left(@TableB_ThreePartName,charindex('.',@TableB_ThreePartName) - 1))
declare @Table_B nvarchar(max) = (
    select  right(@TableB_ThreePartName,len(@TableB_ThreePartName) - charindex('.',@TableB_ThreePartName,len(@Database_B) + 2)))
declare @Schema_B nvarchar(max) = (
    select  replace(replace(@TableB_ThreePartName,@Database_B + '.',''),'.' + @Table_B,''))

-- Get schema for both tables
declare @GetTableADetails nvarchar(max) = '
    use [' + @Database_A +']
        select  COLUMN_NAME
             ,  DATA_TYPE
          from  INFORMATION_SCHEMA.COLUMNS
         where  TABLE_NAME = ''' + @Table_A + '''
           and  TABLE_SCHEMA = ''' + @Schema_A + '''
    '
create table #Table_A_Details (
    ColumnName nvarchar(max)
,   DataType nvarchar(max)
)
insert into #Table_A_Details
exec (@GetTableADetails)

declare @GetTableBDetails nvarchar(max) = '
    use [' + @Database_B +']
        select  COLUMN_NAME
             ,  DATA_TYPE
          from  INFORMATION_SCHEMA.COLUMNS
         where  TABLE_NAME = ''' + @Table_B + '''
           and  TABLE_SCHEMA = ''' + @Schema_B + '''
    '
create table #Table_B_Details (
    ColumnName nvarchar(max)
,   DataType nvarchar(max)
)
insert into #Table_B_Details
exec (@GetTableBDetails)


-- Get differences in table schema
            select  ROW_NUMBER() over (order by
                        a.ColumnName
                    ,   b.ColumnName) as RowKey
                 ,  a.ColumnName as A_ColumnName
                 ,  a.DataType as A_DataType
                 ,  b.ColumnName as B_ColumnName
                 ,  b.DataType as B_DataType
              into  #FieldList
              from  #Table_A_Details a
   full outer join  #Table_B_Details b
                on  a.ColumnName = b.ColumnName
             where  a.ColumnName is null
                or  b.ColumnName is null
                or  a.DataType <> b.DataType

        drop table  #Table_A_Details
        drop table  #Table_B_Details

            select  coalesce(A_ColumnName,B_ColumnName) as ColumnName
                 ,  A_DataType
                 ,  B_DataType
              into  #SchemaVariances
              from  #FieldList

-- Get differences in table data
declare @LastColumn int = (select max(RowKey) from #FieldList)
declare @RowNumber int = 1
declare @ThisField nvarchar(max)
declare @TestSql nvarchar(max)



create table #DataVariances (
    TableKey            nvarchar(max)
,   FieldName           nvarchar(max)
,   TableA_Value        nvarchar(max)
,   TableB_Value        nvarchar(max)
)

delete from #FieldList where A_DataType in ('varbinary','image') or B_DataType in ('varbinary','image') 

while @RowNumber <= @LastColumn begin
    set @TestSql = '
        select  coalesce(a.[' + @KeyName + '],b.[' + @KeyName + ']) as TableKey
             ,  ''' + @ThisField + ''' as FieldName
             ,  a.[' + @ThisField + '] as [TableA_Value]
             ,  b.[' + @ThisField + '] as [TableB_Value]
          from  [' + @Database_A + '].[' + @Schema_A + '].[' + @Table_A + '] a 
    inner join  [' + @Database_B + '].[' + @Schema_B + '].[' + @Table_B + '] b
            on  a.[' + @KeyName + '] = b.[' + @KeyName + ']
         where  ltrim(rtrim(a.[' + @ThisField + '])) <> ltrim(rtrim(b.[' + @ThisField + ']))
            or (a.[' + @ThisField + '] is null and  b.[' + @ThisField + '] is not null)
            or (a.[' + @ThisField + '] is not null and  b.[' + @ThisField + '] is null)
'

insert into #DataVariances
exec (@TestSql)

set @RowNumber = @RowNumber + 1
set @ThisField = (select coalesce(A_ColumnName,B_ColumnName) from #FieldList a where RowKey = @RowNumber)

end

drop table #FieldList

print 'Query complete.  Select from #DataVariances to verify data integrity or #SchemaVariances to verify schemas match.  Data types varbinary and image are not checked.'
Devin Lamothe
quelle
0

Die meisten Antworten scheinen das von Kamil aufgeworfene Problem zu ignorieren. (Dort enthalten die Tabellen identische Zeilen, aber in jeder Tabelle werden unterschiedliche Zeilen wiederholt.) Leider kann ich seine Lösung nicht verwenden, da ich in Oracle bin. Das Beste, was ich mir einfallen lassen konnte, ist:

SELECT * FROM
   (
   SELECT column1, column2, ..., COUNT(*) AS the_count
   FROM tableA
   GROUP BY column1, column2, ...
   MINUS
   SELECT column1, column2, ..., COUNT(*) AS the_count
   FROM tableB
   GROUP BY column1, column2, ...
   )
UNION ALL
   (
   SELECT column1, column2, ..., COUNT(*) AS the_count
   FROM tableB
   GROUP BY column1, column2, ...
   MINUS
   SELECT column1, column2, ..., COUNT(*) AS the_count
   FROM tableA
   GROUP BY column1, column2, ...
   )
Mark W. Bolme
quelle
0

Zum Vergleich von T1 (PK, A, B) und T2 (PK, A, B).

Vergleichen Sie zuerst die Primärschlüsselsätze, um auf beiden Seiten nach fehlenden Schlüsselwerten zu suchen:

SELECT T1.*, T2.* FROM T1 FULL OUTER JOIN T2 ON T1.PK=T2.PK WHERE T1.PK IS NULL OR T2.PK IS NULL;

Listen Sie dann alle Wertinkongruenzen auf:

SELECT T1.PK, 'A' AS columnName, T1.A AS leftValue, T2.A AS rightValue FROM T1 JOIN T2 ON T1.PK=T2.PK WHERE COALESCE(T1.A,0) != COALESCE(T2.A,0)
UNION ALL
SELECT T1.PK, 'B' AS columnName, T1.B AS leftValue, T2.B AS rightValue FROM T1 JOIN T2 ON T1.PK=T2.PK WHERE COALESCE(T1.B,0) != COALESCE(T2.B,0)

A und B müssen vom gleichen Typ sein. Sie können das INFORMATIONSSCHEMA verwenden, um das SELECT zu generieren. Vergessen Sie nicht, dass COALESCE auch IS NULL-Ergebnisse enthält. Sie können auch FULL OUTER JOIN und COALESCE (T1.PK, 0) = COALESCE (T2.PK, 0) verwenden.

Zum Beispiel für Spalten vom Typ varchar:

SELECT concat('SELECT T1.PK, ''', COLUMN_NAME, ''' AS columnName, T1.', COLUMN_NAME, ' AS leftValue, T2.', COLUMN_NAME, ' AS rightValue FROM T1 JOIN T2 ON T1.PK=T2.PK WHERE COALESCE(T1.',COLUMN_NAME, ',0)!=COALESCE(T2.', COLUMN_NAME, ',0)')
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='T1' AND DATA_TYPE IN ('nvarchar','varchar');
Ludovic Aubert
quelle
0

Wir können Daten aus zwei Tabellen von DB2-Tabellen mit der folgenden einfachen Abfrage vergleichen:

Schritt 1: - Wählen Sie aus der Tabelle (T1) des Schemas (S) aus, welche Spalten wir vergleichen möchten.

     SELECT T1.col1,T1.col3,T1.col5 from S.T1

Schritt 2: - Verwenden Sie das Schlüsselwort 'Minus' zum Vergleichen von 2 Tabellen.

Schritt 3: - Wählen Sie aus der Tabelle (T2) des Schemas (S) aus, welche Spalten wir vergleichen möchten.

     SELECT T2.col1,T2.col3,T2.col5 from S.T1

Endresultat:

     SELECT T1.col1,T1.col3,T1.col5 from S.T1
     MINUS 
     SELECT T2.col1,T2.col3,T2.col5 from S.T1;

Wenn die Abfrage keine Zeilen zurückgibt, sind die Daten genau gleich.

Madhushankar MJ
quelle
-1

In MySQL, wo "Minus" nicht unterstützt wird und die Leistung berücksichtigt wird, ist dies schnell

query:
SELECT 
t1.id, 
t1.id 
FROM t1 inner join t2 using (id) where concat(t1.C, t1.D, ...)<>concat(t2.C, t2.D, ...)
Jehad Keriaki
quelle
-1

Eine alternative, erweiterte Abfrage basierend auf der Antwort von dietbuddha & IanMc. Die Abfrage enthält eine Beschreibung, um zu zeigen, wo Zeilen vorhanden sind und fehlen. (Hinweis: für SQL Server )

(
    select 'InTableA_NoMatchInTableB' as Msg, * from tableA
    except
    select 'InTableA_NoMatchInTableB' , * from tableB
)
union all
(
    select 'InTableB_NoMatchInTableA' as Msg, * from tableB
    except
    select 'InTableB_NNoMatchInTableA' ,* from tableA
)
Terry C.
quelle
-1
SELECT * 
FROM TABLE A
WHERE NOT EXISTS (SELECT 'X' 
                  FROM  TABLE B 
                  WHERE B.KEYFIELD1 = A.KEYFIELD1 
                  AND   B.KEYFIELD2 = A.KEYFIELD2 
                  AND   B.KEYFIELD3 = A.KEYFIELD3)
;

'X' ist ein beliebiger Wert.

Wechseln Sie die Tabellen, um die verschiedenen Abweichungen anzuzeigen.

Stellen Sie sicher, dass Sie die Schlüsselfelder in Ihren Tabellen verbinden.

Oder verwenden Sie einfach den MINUS-Operator mit 2 select-Anweisungen. MINUS kann jedoch nur in Oracle arbeiten.

HEXU55
quelle
Minus wird nicht in allen Implementierungen unterstützt. (zB Server Server verwendet außer).
Sir Swears-a-lot