比较两个表,并将SQL Server过程中的记录与状态合并

比较两个表,并将SQL Server过程中的记录与状态合并,sql,sql-server,Sql,Sql Server,我有A桌和B桌。我必须比较这两个表的记录,并使用SQL Server程序返回以下格式的数据 表A id name description 1 A desc A 2 B desc B 3 C desc C 4 D desc D 5 E desc E 6 F desc F 7 G desc G 8 H desc H 9 I desc

我有A桌和B桌。我必须比较这两个表的记录,并使用SQL Server程序返回以下格式的数据

表A

id   name   description
 1    A      desc A
 2    B      desc B
 3    C      desc C
 4    D      desc D
 5    E      desc E
 6    F      desc F
 7    G      desc G
 8    H      desc H
 9    I      desc I
 10   J      desc J 
表B

id   name  description
 1    A        desc A
 2    B        desc B
 3    M        desc M
 4    N        desc N
 5    O        desc O
 6    C        desc C
 7    D        desc D
 8    E        desc E
 9    G        desc G
 10   H        desc H
 11   I        desc I
 12   J        desc J
预期输出如下所示。它有一个额外的字段“status”来说明记录被添加或删除

name  description  status
A        desc A
B        desc B   
M        desc M    newly added
N        desc N    newly added
O        desc O    newly added
C        desc C
D        desc D
E        desc E
F        desc F    removed
G        desc G
H        desc H
I        desc I
J        desc J
我试过下面这样的代码

  select 
     coalesce(a.name, b.name) name,
     coalesce(a.description, b.description) description,
   case
      when a.name is null then 'newly added'
      when b.name is null then 'removed'
   end status
     from tablea a
     full join tableb b on b.name = a.name
但在输出中,新添加的记录M、N、O排在最后一位。。M、 在输入表中,N,O应该在B下。我没有按预期输出中提到的顺序获得输出。

给你

选择t coalescea.name,b.name, 聚结a.描述,b.描述, 案例 当a.name为空时,则为“新添加” 当b.name为空时,则“已删除” 结束状态, 案例 当a.id为空时,则b.id为其他a.id 端id 来自表1 a b.name=a.name上的完全联接表2 b
按照其他问题中的要求,从t order by id中选择名称、描述、状态,我已更新我的答案,添加您的身份栏,而不是行号


注意:您可以根据需要在子查询中使用名称而不是描述。

使用order by Id@Atk。。即使我使用id进行排序,我也无法按照预期输出的确切顺序进行排序。您能否提供您的创建表和插入脚本,以便我可以在我的末尾进行测试?@Atk create table a id int,name varchar10,description varchar20;在a值中插入1,'a','descr a';在a中插入值2,'B','descr B';在a值中插入3,'C','descr C';在a值中插入4,“D”,“descr D”;在值5中插入“E”、“descr E”;在a值中插入6,“F”,“descr F”;在a值中插入7,“G”,“descr G”;在a值中插入8,'H','descr H';在值9中插入'I','descr I';在值10中插入'J','descr J';@Atk创建表b id int,名称varchar10,描述varchar20;在b值中插入1,'A','descr A';在b值中插入2,'b','descr b';在b值中插入3,'M','descr M';在b值中插入4,'N','descr N';在b值中插入5,'O','descr O';在b值中插入6,'C','descr C';在b值中插入7,“D”,“descr D”;在b值中插入8个“E”、“descr E”;在b值中插入9,'G','descr G';在b值中插入10,'H','descr H';在b值中插入11,'I','descr I';在b值中插入12,'J','descr i'@arun..此查询在my DB中执行时出现以下错误。。你能帮忙吗?错误:子查询返回的值超过1。当子查询在=、!=、=或者当子查询用作表达式时。@sahira,表中是否有重复项?否则它不会抛出此错误。不知何故,子查询返回了多个值。做一件事,在最后一个子查询中将描述更改为name并选中……isnullb.id,从b tr中选择tr.id,其中name=选择TOP 1 name@你能不能用名字而不是描述来更新你的演示代码?好的@萨赫拉
SELECT COALESCE(a.NAME, b.NAME) NAME, 
       COALESCE(a.description, b.description) description, 
       CASE 
         WHEN a.NAME IS NULL THEN 'newly added' 
         WHEN b.NAME IS NULL THEN 'removed' 
       END status 
FROM   a FULL JOIN b ON b.NAME = a.NAME 
ORDER  BY ISNULL(b.id, (SELECT sb.id 
                        FROM   b sb 
                        WHERE  description = (SELECT TOP 1 description 
                                              FROM   a sa 
                                              WHERE sa.id < a.id 
                                              ORDER  BY sa.id DESC)))