比较两个表,并将SQL Server过程中的记录与状态合并
我有A桌和B桌。我必须比较这两个表的记录,并使用SQL Server程序返回以下格式的数据 表A比较两个表,并将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
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)))