表1
+------+-----+-----+
| Name | RID | SID |
+------+-----+-----+
| A | 1 | 9 |
| B | 2 | 8 |
| C | 3 | 7 |
| D | 4 | 6 |
+------+-----+-----+
表2
+------+-----+-----+
| Name | RID | SID |
+------+-----+-----+
| A | 1 | 9 |
| B | 4 | 8 |
| C | 3 | 7 |
| D | 4 | 9 |
+------+-----+-----+
我想比较两个表中的值并获得如下输出。我可以使用 EXCEPT 找到不匹配的记录,但是无法获得预期的格式。
+------+-------------+
| Name | Diff |
+------+-------------+
| B | RID: 2 -> 8 |
| D | SID: 6 -> 9 |
+------+-------------+
我在下面尝试过
Select Name , RID, SID from Table1
Except
Select Name , RID, SID from Table2
答案 0 :(得分:2)
您可以使用此查询来获得所需的结果。它在给定img
具有不同JOIN
或Table1
值的任何行上Table2
个RID
和SID
,然后使用{{ 1}}(自2017年以来可用)以获取所需的Name
值。请注意,此代码还将处理两者 CONCAT_WS
和Diff
都不相同的情况:
RID
如果您在2017年之前运行SQL Server并且没有SID
,则可以使用仅使用SELECT t1.Name,
CONCAT_WS(', ',
CASE WHEN t1.RID != t2.RID THEN CONCAT('RID: ', t1.RID, ' -> ', t2.RID) END,
CASE WHEN t1.SID != t2.SID THEN CONCAT('SID: ', t1.SID, ' -> ', t2.SID) END
) AS Diff
FROM Table1 t1
JOIN Table2 t2 ON t2.Name = t1.Name
AND (t2.RID != t1.RID OR t2.SID != t1.SID)
的此查询:
CONCAT_WS
输出(用于我的扩展演示):
CONCAT
答案 1 :(得分:0)
尝试以下操作,这里是demo。
select
t1.name,
case
when
t1.rid != t2.rid
then
concat('RID: ', t1.rid, '->', t1.sid)
else
concat('SID: ', t1.rid, '->', t1.sid)
end
as diff
from table1 t1
join table2 t2
on t1.name = t2.name
where t1.rid != t2.rid
or t1.sid != t2.sid
输出:
| Name | Diff |
+------+-------------+
| B | RID: 2 -> 8 |
| D | SID: 6 -> 9 |