比较记录并以文本形式获取差异

时间:2020-05-12 03:46:10

标签: sql sql-server

表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

2 个答案:

答案 0 :(得分:2)

您可以使用此查询来获得所需的结果。它在给定img具有不同JOINTable1值的任何行上Table2RIDSID,然后使用{{ 1}}(自2017年以来可用)以获取所需的Name值。请注意,此代码还将处理两者 CONCAT_WSDiff都不相同的情况:

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

Demo on SQLFiddle

答案 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 |
相关问题