복붙노트

[SQL] SQL은 두 개의 테이블에서 데이터를 비교

SQL

SQL은 두 개의 테이블에서 데이터를 비교

I는 예컨대 테이블 TableA의 모두 열의 동일한 포맷을 가지고 TableB의 컬럼이 두 테이블과 TableA의 TableB의이

A B C D E F 

여기서, A와 B는 기본 키이다.

어떻게 동일한 기본 키가 TableA의와 TableB의 정확히 모든 열에서 같은 값을 포함하는 경우 그것을 확인하기 위해 SQL을 작성합니다.

그것은이 두 테이블은 정확히 같은 데이터를 가지고 있다는 것을 의미한다.

해결법

  1. ==============================

    1.당신은 "마이너스"을 수행 할 수 또는 SQL이 DBMS에 의해 사용의 맛에 따라 "EXCEPT"한다.

    당신은 "마이너스"을 수행 할 수 또는 SQL이 DBMS에 의해 사용의 맛에 따라 "EXCEPT"한다.

    select * from tableA
    minus
    select * from tableB
    

    쿼리에 행을 반환하지 않는 경우 다음 데이터가 정확히 동일합니다.

  2. ==============================

    2.관계 연산자를 사용 :

    관계 연산자를 사용 :

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

    변경 Oracle 용 MINUS는 예외로합니다.

    약간 까다로운 점 : 위는 SQL 표준에 따라 YMMV 있도록 구현 의존 연산자 우선 순위에 의존합니다. 그것은 우선 순위가있는 SQL 서버, 작동 :

  3. ==============================

    3.dietbuddha 좋은 답을 가지고있다. 당신이 MINUS이 있거나 EXCEPT하지 않는 경우, 하나의 옵션은 모든 열에서, 모든 테이블 사이에 그룹을 노동 조합을하고 있는지 모든 것을이 존재하는 것입니다 :

    dietbuddha 좋은 답을 가지고있다. 당신이 MINUS이 있거나 EXCEPT하지 않는 경우, 하나의 옵션은 모든 열에서, 모든 테이블 사이에 그룹을 노동 조합을하고 있는지 모든 것을이 존재하는 것입니다 :

    SELECT col1, col2, col3
    FROM
    (SELECT * FROM tableA
    UNION ALL  
    SELECT * FROM tableB) data
    GROUP BY col1, col2, col3
    HAVING count(*)!=2
    
  4. ==============================

    4.

    SELECT c.ID
    FROM clients c
    WHERE EXISTS(SELECT c2.ID 
    FROM clients2 c2
    WHERE c2.ID = c.ID);
    

    두 테이블에서 같은 모든 ID 년대를 반환합니다. NOT 존재에 차이 변화가 존재 얻으려면.

  5. ==============================

    5.onedaywhen에서 스크립트를 가지고 가서, 나는 그것이 또한 각 항목에서 제공하는 테이블 보여주기 위해 수정했습니다.

    onedaywhen에서 스크립트를 가지고 가서, 나는 그것이 또한 각 항목에서 제공하는 테이블 보여주기 위해 수정했습니다.

    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
    
  6. ==============================

    6.다만 COMPLET로 발동 2 테이블과 비교하고 오류 상태 3, ADD, DEL, GAP와 같은 테이블에서 결과를 제공하는 방법을 제외하여 저장 테이블이 같은 PK가 있어야합니다, 당신은 하나 개 또는 두 테이블의 비교 2 개 테이블과 필드를 선언

    다만 COMPLET로 발동 2 테이블과 비교하고 오류 상태 3, ADD, DEL, GAP와 같은 테이블에서 결과를 제공하는 방법을 제외하여 저장 테이블이 같은 PK가 있어야합니다, 당신은 하나 개 또는 두 테이블의 비교 2 개 테이블과 필드를 선언

    이 같은 그냥 사용 ps_TableGap 'TBL1', 'TBL2', 'FLD1, FLD2, fld3', 'fld4'fld5'fld6'(선택 사항)

    /****** 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
    
  7. ==============================

    7.dietbuddha의 대답을 향상 ...

    dietbuddha의 대답을 향상 ...

    select * from
    (
        select * from tableA
        minus
        select * from tableB
    )
    union all
    select * from
    (
        select * from tableB
        minus
        select * from tableA
    )
    
  8. ==============================

    8.당신은 모든 전체 외부 오라클에 참여 삽입의 조합을 사용하여 두 테이블의 차이를 찾을 수 있습니다. SQL에서는 완전 외부를 통해 차이 가입 추출 할 수 있지만 것으로 보인다 SQL의 모든 / 첫번째 나던 존재 삽입! 따라서, 대신 다음 쿼리를 사용해야합니다 :

    당신은 모든 전체 외부 오라클에 참여 삽입의 조합을 사용하여 두 테이블의 차이를 찾을 수 있습니다. SQL에서는 완전 외부를 통해 차이 가입 추출 할 수 있지만 것으로 보인다 SQL의 모든 / 첫번째 나던 존재 삽입! 따라서, 대신 다음 쿼리를 사용해야합니다 :

    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
    

    사용하지만 'OR'절은 권장되지 않으며 그것은 일반적으로 낮은 성능을 산출 곳 테이블이 대규모하지 않은 경우, 당신은 여전히 ​​쿼리 이상 사용할 수있다. 위의 질의에 대한 결과가 있다면, 정확히 필드 1,2,3,4의 비교를 기반으로 두 테이블의 차이입니다. 잘가 (주석 부분을 확인)으로 쿼리 성능을 향상 들어, 날짜를 필터링 할 수 있습니다

  9. ==============================

    9.

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

    결과는 널 (null)이지만, 소스는 다르다!

    그러나:

    (
        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])
    )
    

    공장.

  10. ==============================

    10.나는 SQL 서버에서이 같은 문제를 가지고 프로세스를 자동화하는이 T-SQL 스크립트를 (실제로는 물을 다운 버전이, 내 모든 쉽게보고를위한 하나의 테이블은 diff 쓴) 썼습니다.

    나는 SQL 서버에서이 같은 문제를 가지고 프로세스를 자동화하는이 T-SQL 스크립트를 (실제로는 물을 다운 버전이, 내 모든 쉽게보고를위한 하나의 테이블은 diff 쓴) 썼습니다.

    업데이트 '을 MyTable'과 비교하고자하는 테이블의 이름에 'MyOtherTable'.

    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
    
  11. ==============================

    11.나는 SQL 서버에 오라클에서 이식 꽤 불쾌한 뷰의 결과를 비교하기 위해 썼다. 이 표에 (당신이 그것을 짐작) 데이터의 차이와 테이블 자체의 스키마, 임시 테이블, #DataVariances 및 #SchemaVariances 한 쌍을 만듭니다.

    나는 SQL 서버에 오라클에서 이식 꽤 불쾌한 뷰의 결과를 비교하기 위해 썼다. 이 표에 (당신이 그것을 짐작) 데이터의 차이와 테이블 자체의 스키마, 임시 테이블, #DataVariances 및 #SchemaVariances 한 쌍을 만듭니다.

    이 두 테이블에 기본 키가 필요하지만, 소스 테이블이없는 경우 당신은 ID 열 tempdb에에 드롭 할 수있다.

    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.'
    
  12. ==============================

    12.응답의 대부분은 카밀에 의해 제기 된 문제를 무시하는 것 같다. (테이블이 동일한 행을 포함하지만, 다른 사람이 각 테이블에서 반복되는 곳이다.) 불행하게도, 내가 오라클이기 때문에, 자신의 솔루션을 사용할 수 없습니다입니다. I가 가지고 올 수 있었던 가장 :

    응답의 대부분은 카밀에 의해 제기 된 문제를 무시하는 것 같다. (테이블이 동일한 행을 포함하지만, 다른 사람이 각 테이블에서 반복되는 곳이다.) 불행하게도, 내가 오라클이기 때문에, 자신의 솔루션을 사용할 수 없습니다입니다. I가 가지고 올 수 있었던 가장 :

    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, ...
       )
    
  13. ==============================

    13.우리는 간단한 쿼리 아래 사용하여 DB2 테이블의 두 테이블에서 데이터를 비교할 수 있습니다

    우리는 간단한 쿼리 아래 사용하여 DB2 테이블의 두 테이블에서 데이터를 비교할 수 있습니다

    1 단계 : - 우리는 테이블 스키마 (T1)에서 비교하기 위해 필요한 모든 열 선택 (S)

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

    2 단계 : - 두 테이블을 비교하기위한 사용 '마이너스'키워드.

    3 단계 : - 우리는 테이블 스키마 (T2)에서 비교하기 위해 필요한 모든 열 선택 (S)

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

    최종 결과 - SELECT T1.col1, T1.col3, S.T1에서 T1.col5 마이너스 SELECT T2.col1, T2.col3, S.T1에서 T2.col5;

    쿼리에 행을 반환하지 않는 경우 다음 데이터가 정확히 동일합니다.

  14. ==============================

    14.T1 (PK, A, B) 및 T2 (PK, A, B)을 비교한다.

    T1 (PK, A, B) 및 T2 (PK, A, B)을 비교한다.

    먼저 양쪽에 키 값을 누락 찾기 위해 기본 키 세트를 비교 :

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

    그런 다음 모든 값이 일치 목록 :

    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와 B는 같은 유형이어야합니다. 당신은 SELECT를 생성하는 정보 스키마를 사용할 수 있습니다. 또한 NULL 결과입니다 포함하도록 COALESCE을 잊지 마십시오. 또한 FULL OUTER JOIN을 사용 할 수 COALESCE (T1.PK, 0) = COALESCE (T2.PK, 0).

    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');
    
  15. ==============================

    15."마이너스"지원 및 계정으로 성능을 복용하지 않는 MySQL의에서이 빠른입니다

    "마이너스"지원 및 계정으로 성능을 복용하지 않는 MySQL의에서이 빠른입니다

    query:
    SELECT 
    t1.id, 
    t1.id 
    FROM t1 inner join t2 using (id) where concat(t1.C, t1.D, ...)<>concat(t2.C, t2.D, ...)
    
  16. ==============================

    16.dietbuddha & IanMc에 의해 답변에 따라 대안, 향상된 쿼리. 행이 존재 누락되는 경우 유용하게이 쇼에 쿼리에 대한 설명이 포함되어 있습니다. (NB : SQL Server에 대한)

    dietbuddha & IanMc에 의해 답변에 따라 대안, 향상된 쿼리. 행이 존재 누락되는 경우 유용하게이 쇼에 쿼리에 대한 설명이 포함되어 있습니다. (NB : 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
    )
    
  17. ==============================

    17.

    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'는 임의의 값이다.

    서로 다른 차이를 볼 수있는 테이블을 전환합니다.

    당신의 테이블에 키 필드에 가입해야합니다.

    아니면 그냥 2 select 문으로 MINUS 연산자를 사용하지만, MINUS는 오라클에서 작업 할 수 있습니다.

  18. from https://stackoverflow.com/questions/4602083/sql-compare-data-from-two-tables by cc-by-sa and MIT license