sql-server - mssql比较两个表,只返回不相同的列
问题描述
我想知道两个表'table1'和'table2'是否相同。我知道我可以比较“where”子句中两个表的每一列所以这基本上会告诉我每一行都是相同的。
但我想知道的是哪些列是相同的。因此,我认为只转换表格并比较前面提到的结果会很容易。表中的列名和顺序与已经给出的相同。我还制作了一个示例输入和输出场景:
--------输入--------------- table1
ID | col1 | col2 | col3 |
---|---|---|---|
1 | 14 | 23 | 45 |
2 | 12 | 21 | 43 |
3 | 12 | 22 | 43 |
4 | 10 | 12 | 41 |
5 | 11 | 23 | 44 |
6 | 13 | 25 | 43 |
表2
ID | col1 | col2 | col3 |
---|---|---|---|
1 | 14 | 20 | 45 |
2 | 12 | 0 | 43 |
3 | 12 | 22 | 43 |
4 | 10 | 30 | 41 |
5 | 11 | 23 | 44 |
6 | 13 | 43 |
- - - - - 输出 - - - - - - - -
结果
col2 |
---|
20 |
0 |
22 |
30 |
23 |
或结果
??? | ??? | ??? | ??? | ??? | ??? | ??? |
---|---|---|---|---|---|---|
col2 | 20 | 0 | 22 | 30 | 23 |
或结果
col2 |
---|
或结果
表 1.col2 | 表 2.col2 |
---|---|
23 | 20 |
21 | 0 |
22 | 22 |
12 | 30 |
23 | 23 |
25 |
或类似..... 不同列的值无关紧要,我只需要列名,但我不在乎值是否会随之而来。我希望它不会太难。
解决方案
考虑到您真的只想接收相同的列,您可能想尝试使用 unpivot 的方法。举个例子:
DECLARE @t1 TABLE(
id int
,col1 int
,col2 int
,col3 int
);
INSERT INTO @t1 VALUES
(1,14,23,45)
,(2,12,21,43)
,(3,12,22,43)
,(4,10,12,41)
,(5,11,23,44)
,(6,13,25,43);
DECLARE @t2 TABLE(
id int
,col1 int
,col2 int
,col3 int
);
INSERT INTO @t2 VALUES
(1,14,20,45)
,(2,12,0,43)
,(3,12,22,43)
,(4,10,30,41)
,(5,11,23,44)
,(6,13,NULL,43);
WITH cte1 AS(
SELECT id, col, val
FROM (SELECT id, col1, col2, col3 FROM @t1) p
UNPIVOT
(val FOR col IN (col1, col2, col3)) as unpvt
),
cte2 AS(
SELECT id, col, val
FROM (SELECT id, col1, col2, col3 FROM @t2) p
UNPIVOT
(val FOR col IN (col1, col2, col3)) as unpvt
)
SELECT DISTINCT c1.id, c1.col, c1.val
FROM cte1 c1
INNER JOIN cte2 c2 ON c2.id = c1.id AND c2.col = c1.col AND c2.val = c1.val
ORDER BY 1, 2
推荐阅读
- android - 移动 PWA 是独立的,但不是在从设备照片返回后
- javascript - 为什么我的值不是来自 web 服务通过 AJAX 插入选择标签?
- python - 带有时间轴控制的 Pandas 时间序列 DataFrame 绘图
- r - 为什么这三个 ggsurvplots 不合并为一个?
- python - 如何从CSV(YMD)中的日期时间获取星期几
- php - 自定义 Woocommerce 产品列表短代码
- python - 来自用户的矩阵耦合输入
- android - 如何对 Android 中弹出的位置服务进行单元测试
- python - 如何从不同的文件中调用一个类?
- bash - 为 BASH 脚本导出系统日志文件创建进度条