SQL so sánh dữ liệu từ hai bảng


88

Tôi có 2 bảng TableATableBcó cùng định dạng cột, ví dụ cả hai bảng TableATableBcó cột

A B C D E F 

trong đó A và B là khóa chính.

Cách viết SQL để kiểm tra xem nếu TableAvà khóa TableBđó có cùng khóa chính có chứa chính xác cùng một giá trị trong mọi cột hay không.

Có nghĩa là hai bảng này có dữ liệu hoàn toàn giống nhau.

Câu trả lời:


81

Bạn có thể "TRỪ" hoặc "TRỪ" tùy thuộc vào kiểu SQL được DBMS của bạn sử dụng.

select * from tableA
minus
select * from tableB

Nếu truy vấn trả về không có hàng nào thì dữ liệu hoàn toàn giống nhau.


5
Đề xuất tuyệt vời. Tuy nhiên, tôi nghĩ rằng điều này có thể không hiệu quả nếu tableB có thêm một (các) hàng, vì vậy bạn có thể muốn so sánh số lượng hàng với nhau.
jzd

5
Đi đường vòng khác. Nó sẽ không hoạt động nếu tableAcó thêm hàng. Bạn sẽ cần (A EXCEPT B) INTERSECT (B EXCEPT A)Tôi đoán điều này sẽ kém hiệu quả hơn nhiều so với một phép nối chuẩn sag.
Martin Smith

truy vấn trả về hai tập kết quả ??
BuZz

Truy vấn này sẽ trả về các hàng có NULLS nếu có.
Reeya Oberoi

5
@Franklin - Không, nó chỉ trả về một tập kết quả. Nếu bạn nhận được hai, hãy sử dụng EXCEPT thay cho MINUS.
MTS

56

Sử dụng toán tử quan hệ:

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

Đổi EXCEPTthành MINUSOracle.

Điểm hơi cầu kỳ: ở trên phụ thuộc vào mức độ ưu tiên của toán tử, mà theo Tiêu chuẩn SQL là phụ thuộc vào việc triển khai, vì vậy YMMV. Nó hoạt động cho SQL Server, ưu tiên là:

  1. Biểu thức trong ngoặc đơn
  2. INTERSECT
  3. EXCEPTUNIONđánh giá từ trái sang phải.

Đối với Oracle, bạn cần sử dụng dấu ngoặc đơn xung quanh UNION, dấu ngoặc đơn xung quanh INTERSECT và (như đã lưu ý) thay EXCEPT bằng MINUS. HTH.
Doug Clutter

20

dietbuddha có một câu trả lời hay. Trong trường hợp bạn không có MINUS hoặc EXCEPT, một tùy chọn là hợp nhất tất cả các bảng, nhóm theo tất cả các cột và đảm bảo có hai trong số mọi thứ:

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

Tôi đã thử sử dụng cái này (tôi lấy nó từ Blog SQL Server của Jeff ) nhưng tôi muốn liệt kê cả hai hàng từ TableA và TableB để tôi có thể nhìn thấy sự khác biệt trong các hàng một cách trực quan. Bạn có vui lòng giải thích cách làm điều đó không?
Emmanuel F

@Agent, điều này nghe giống như một câu hỏi riêng biệt. Tôi khuyên bạn nên liệt kê nó để những người khác sẽ nhìn thấy nó, thay vì chỉ một bình luận ở đây.
jzd

Làm xong. Và thực hiện. So sánh giá trị của 2 bảng và liệt kê các hàng khác nhau . Hy vọng rằng tôi sẽ nhận được một số kết quả tuyệt vời. :)
Emmanuel F

Điều này hoạt động tốt trong các môi trường SQL hạn chế như Visual FoxPro, cảm ơn!
Kit Roed 17/12/12

1
Chỉ cần xem xét điều này. Điều đáng nói là các khóa chính đảm bảo các bản ghi duy nhất trong các bảng. Điều đó nếu một bảng (hoặc truy vấn) có thể có các hàng trùng lặp, DISTINCT/ GROUP BYđược đề xuất cho các truy vấn con trong liên hợp, để đảm bảo chỉ có một bản ghi cho mỗi bảng. Nếu không, TableA có thể có 2 bản ghi và TableB có thể có 0 và không đáp ứng điều kiện HAVING.
vol7ron

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

Sẽ trả về tất cả các ID giống nhau trong cả hai bảng. Để nhận được sự khác biệt, hãy thay đổi TỒN TẠI thành KHÔNG TỒN TẠI.


3

Lấy script từ onedaywhen, tôi đã sửa đổi nó để hiển thị từng mục nhập đến từ bảng nào.

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

2

chỉ để hoàn thành, một proc được lưu trữ bằng phương thức ngoại trừ để so sánh 2 bảng và cho kết quả trong cùng một bảng có trạng thái 3 lỗi, bảng ADD, DEL, GAP phải có cùng PK, bạn khai báo 2 bảng và trường để so sánh của 1 hoặc cả 2 bảng

Chỉ cần sử dụng ps_TableGap này 'tbl1', 'Tbl2', 'fld1, fld2, fld3', 'fld4'fld5'fld6' (tùy chọn)

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

2

Nguồn: Sử dụng NATURAL FULL JOIN để so sánh hai bảng trong SQL của Lukas Eder

Cách tiếp cận thông minh của việc sử dụng NATURAL FULL JOINđể phát hiện các hàng giống nhau / khác nhau giữa hai bảng.

Ví dụ 1 - cờ trạng thái:

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

Ví dụ 2 - lọc hàng

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 <> bản trình diễn fiddle


1

Cải tiến cho câu trả lời của dietbuddha ...

select * from
(
    select * from tableA
    minus
    select * from tableB
)
union all
select * from
(
    select * from tableB
    minus
    select * from tableA
)

1

Bạn có thể tìm thấy sự khác biệt của 2 bảng bằng cách sử dụng kết hợp chèn tất cả và kết hợp bên ngoài đầy đủ trong Oracle. Trong sql, bạn có thể trích xuất sự khác biệt thông qua kết nối bên ngoài đầy đủ nhưng có vẻ như chèn tất cả / đầu tiên không tồn tại trong sql! Do đó, bạn phải sử dụng truy vấn sau để thay thế:

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

Mặc dù sử dụng 'OR' trong mệnh đề where không được khuyến khích và nó thường mang lại hiệu suất thấp hơn, bạn vẫn có thể sử dụng truy vấn trên nếu bảng của bạn không lớn. Nếu có bất kỳ kết quả nào cho truy vấn trên thì đó chính xác là sự khác biệt của 2 bảng dựa trên so sánh các trường 1,2,3,4. Để cải thiện hiệu suất truy vấn, bạn cũng có thể lọc nó theo ngày (kiểm tra phần nhận xét)


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

Kết quả là rỗng, nhưng các nguồn khác nhau!

Nhưng:

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

làm.


0

Tôi đã gặp vấn đề tương tự trong SQL Server và đã viết tập lệnh T-SQL này để tự động hóa quy trình (thực sự đây là phiên bản được thiết kế nhỏ hơn, tôi đã viết tất cả các khác biệt vào một bảng để dễ báo cáo).

Cập nhật 'MyTable' và 'MyOtherTable' thành tên của các bảng bạn muốn so sánh.

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

0

Tôi viết bài này để so sánh kết quả của một chế độ xem khá khó chịu mà tôi đã chuyển từ Oracle sang SQL Server. Nó tạo một cặp bảng tạm thời, #DataVariances và #SchemaVariances, với sự khác biệt về dữ liệu trong bảng và lược đồ của chính bảng đó.

Nó yêu cầu cả hai bảng phải có khóa chính, nhưng bạn có thể thả nó vào tempdb với một cột nhận dạng nếu các bảng nguồn không có.

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

0

Hầu hết các câu trả lời dường như phớt lờ vấn đề mà Kamil nêu ra. (Đó là nơi các bảng chứa các hàng giống hệt nhau, nhưng các hàng khác nhau được lặp lại trong mỗi bảng.) Thật không may, tôi không thể sử dụng giải pháp của anh ấy, vì tôi đang ở Oracle. Điều tốt nhất tôi có thể nghĩ ra là:

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

0

Để so sánh T1 (PK, A, B) và T2 (PK, A, B).

Trước tiên, hãy so sánh các bộ khóa chính để tìm kiếm các giá trị khóa bị thiếu ở một trong hai bên:

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

Sau đó, liệt kê tất cả các giá trị không khớp:

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 và B phải cùng loại. Bạn có thể sử dụng SCHEMA THÔNG TIN để tạo CHỌN. Đừng quên COALESCE cũng bao gồm kết quả LÀ KHÔNG. Bạn cũng có thể sử dụng FULL OUTER JOIN và COALESCE (T1.PK, 0) = COALESCE (T2.PK, 0).

Ví dụ cho các cột kiểu 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');

0

Chúng ta có thể so sánh dữ liệu từ hai bảng DB2 bằng cách sử dụng truy vấn đơn giản dưới đây,

Bước 1: - Chọn tất cả các cột mà chúng ta cần so sánh từ bảng (T1) của lược đồ (S)

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

Bước 2: - Sử dụng từ khóa 'Trừ' để so sánh 2 bảng.

Bước 3: - Chọn tất cả các cột mà chúng ta cần so sánh từ bảng (T2) của lược đồ (S)

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

Kết quả cuối cùng:

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

Nếu truy vấn trả về không có hàng nào thì dữ liệu hoàn toàn giống nhau.


-1

Trong MySQL, nơi "dấu trừ" không được hỗ trợ và có tính đến hiệu suất, đây là một

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

-1

Một truy vấn thay thế, nâng cao dựa trên câu trả lời của dietbuddha & IanMc. Truy vấn bao gồm mô tả để hiển thị hữu ích vị trí các hàng tồn tại và bị thiếu. (NB: dành cho 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
)

-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' là bất kỳ giá trị nào.

Chuyển đổi các bảng để xem sự khác biệt khác nhau.

Đảm bảo tham gia các trường chính trong bảng của bạn.

Hoặc chỉ sử dụng toán tử MINUS với 2 câu lệnh select, tuy nhiên, MINUS chỉ có thể hoạt động trong Oracle.


trừ không được hỗ trợ trong tất cả các triển khai. (ví dụ: máy chủ server sử dụng ngoại trừ).
Ngài Swears-a-lot, 13/08/18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.