SQL比较来自两个表的数据

nik*_*kky 76 sql

我有2个表TableA,TableB并且具有相同的列格式,例如两个表TableATableB

A B C D E F 
Run Code Online (Sandbox Code Playgroud)

其中A和B是主键.

如何编写SQL来检查,如果TableATableB具有相同主键正好包含在每列中的值相同.

这意味着这两个表具有完全相同的数据.

die*_*dha 69

根据DBMS使用的SQL的风格,您应该能够"减少"或"除外".

select * from tableA
minus
select * from tableB
Run Code Online (Sandbox Code Playgroud)

如果查询没有返回任何行,则数据完全相同.

  • 优秀的建议.但是,我认为如果tableB有一个额外的行,这可能不起作用,所以你可能想要另外比较行数. (5认同)
  • 另一边.如果`tableA`有额外的行,它将无法工作.你需要`(除了B除外)(B除了A)`我猜这会比沼泽标准连接效率低得多. (5认同)
  • @Franklin - 不,它应该只返回一个结果集.如果你得到两个,请使用EXCEPT代替MINUS. (5认同)

one*_*hen 46

使用关系运算符:

SELECT * FROM TableA
UNION 
SELECT * FROM TableB
EXCEPT 
SELECT * FROM TableA
INTERSECT
SELECT * FROM TableB;
Run Code Online (Sandbox Code Playgroud)

更改EXCEPTMINUS甲骨文.

稍微挑剔点:上面依赖于运算符优先级,根据SQL标准是依赖于实现的,所以YMMV.它适用于SQL Server,其优先级为:

  1. 括号中的表达式
  2. INTERSECT
  3. EXCEPTUNION从左到右进行评估.

  • 很好的答案。但添加两对括号比解释优先级并担心正在使用哪个 SQL 平台更容易。 (11认同)
  • 对于 Oracle,您需要在 UNION 周围使用括号,在 INTERSECT 周围使用括号,并且(如前所述)将 EXCEPT 替换为 MINUS。HTH。 (3认同)
  • 也适用于 AWS Athena:`(SELECT * FROM TableA UNION SELECT * FROM TableB) EXCEPT (SELECT * FROM TableA INTERSECT SELECT * FROM TableB)` 也可以不带括号,但如果逻辑因实现而异,为什么不添加它们以避免意外行为。 (2认同)

jzd*_*jzd 16

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
Run Code Online (Sandbox Code Playgroud)

  • 只是回顾一下这个。值得一提的是,主键确保表中的记录唯一。如果一个表(或查询)可能有重复的行,建议联合中的子查询使用“DISTINCT”/“GROUP BY”,以确保每个表只有一条记录。否则,TableA 可能有 2 条记录,TableB 可能有 0 条记录,并且不满足 HAVING 条件。 (2认同)

小智 7

SELECT c.ID
FROM clients c
WHERE EXISTS(SELECT c2.ID 
FROM clients2 c2
WHERE c2.ID = c.ID);
Run Code Online (Sandbox Code Playgroud)

将返回两个表中所有相同的ID.要获得差异,请将EXISTS更改为NOT EXISTS.


小智 6

从 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
Run Code Online (Sandbox Code Playgroud)