我有2个表TableA,TableB并且具有相同的列格式,例如两个表TableA和TableB列
A B C D E F
Run Code Online (Sandbox Code Playgroud)
其中A和B是主键.
如何编写SQL来检查,如果TableA与TableB具有相同主键正好包含在每列中的值相同.
这意味着这两个表具有完全相同的数据.
die*_*dha 69
根据DBMS使用的SQL的风格,您应该能够"减少"或"除外".
select * from tableA
minus
select * from tableB
Run Code Online (Sandbox Code Playgroud)
如果查询没有返回任何行,则数据完全相同.
one*_*hen 46
使用关系运算符:
SELECT * FROM TableA
UNION
SELECT * FROM TableB
EXCEPT
SELECT * FROM TableA
INTERSECT
SELECT * FROM TableB;
Run Code Online (Sandbox Code Playgroud)
更改EXCEPT到MINUS甲骨文.
稍微挑剔点:上面依赖于运算符优先级,根据SQL标准是依赖于实现的,所以YMMV.它适用于SQL Server,其优先级为:
INTERSECTEXCEPT并UNION从左到右进行评估.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)
小智 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)
| 归档时间: |
|
| 查看次数: |
332440 次 |
| 最近记录: |