SQL 两表联查,有表A表B,有相同的列:姓名,电话,当电话相同而姓名不同时,姓名=A姓名+B姓名,电话不相同时,姓名=原姓名。本语句已实现,现想逆向运行。

oiph 2012-05-11 03:49:02
表述可能不太清楚,以下面的两个表为例。
A表
姓名 电话
张三 5566742
李四 13088889999
赵五 13877776666
鬼子六 3322152

B表
石头 5566742
麻子 13088889999
赵五 13877776666
泡泡 13900002222

想达成的新的A表(首选在原表中改变,若不能,则生成新表)
张三+石头 5566742
李四+麻子 13088889999
赵五 13877776666
鬼子六 3322152
泡泡 13900002222

(说明:
1新表中的第1个和第2个电话,A表和B表都有,但名字不同,新表中用+连续A表和B表和名字。
2新表中的第3个电话,A表B表都有,且名字相同,新表中沿用以前的名字。
3新表中的第4个电话,仅只出现在A表,名字和电话就用A表中的。
4新表中的第5个电话,仅只出现在B表,名字和电话就用B表中的。
5+号,只是一个连接符号,若不可用,则用-或别的称号代替。谢谢!)

解决方案:
update a set 姓名=姓名+isnull(select ','+姓名 from B表 where 电话=a.电话 for xml path(''),'')
from A表 a

insert into A表
select * from B表 a where not exists(select 1 from A表 where 电话=a.电话)


现在想作逆向操作,即把上面四行语句运行一次后,有没有办法逆向运行(也可以说是撤销上次操作),让A表回到原来的状态。(之所以要这个功能是因为,不小心误操作了一次,想让A表回来上一步的状态,谢谢。
形象的说就是现在的
A表
张三+石头 5566742
李四+麻子 13088889999
赵五 13877776666
鬼子六 3322152
泡泡 13900002222

B表
石头 5566742
麻子 13088889999
赵五 13877776666
泡泡 13900002222

新的A表
姓名 电话
张三 5566742
李四 13088889999
赵五 13877776666
鬼子六 3322152

如果没有方法,只有手工去改正错误,如果有语句可运行,实在是帮了大忙,谢谢。
...全文
291 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzzzzkkikkk 2012-05-12
  • 打赏
  • 举报
回复
已经组合成的A表中包含的一些条目,不能确定哪些是从B表抽过来的,哪些是原来A表有,而且B表也有的啊!坐看大神解决!
oiph 2012-05-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

SQL code

create table a (name nvarchar(120),phone varchar(120))
go
create table b (name nvarchar(120),phone varchar(120))
go

insert a
select '张三','5566742' union
select '李四','13088889999'union ……
[/Quote]

谢谢你,完美解决!
暖暖2021 2012-05-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

SQL code

delete from A表 a where exists (select 1 from B表 where 电话=a.电话 and 姓名=a.姓名 )

update A表 set 姓名=case when charindex(',',姓名)>=1 then LEFT(姓名,charindex(',',姓名)-1) else 姓名 end
[/Quote]
思路很清晰,学习了
Felixzhaowenzhong 2012-05-11
  • 打赏
  • 举报
回复

create table a (name nvarchar(120),phone varchar(120))
go
create table b (name nvarchar(120),phone varchar(120))
go

insert a
select '张三','5566742' union
select '李四','13088889999'union
select '赵五','13877776666'union
select '鬼子六','3322152'

insert b
select '石头','5566742'union
select '麻子','13088889999'union
select '赵五','13877776666'union
select '泡泡','13900002222'
go

update a set name=name+isnull((select ','+name from B where phone=a.phone for xml path('')),'')
from A a
select * from a
/*
鬼子六 3322152
李四,麻子 13088889999
张三,石头 5566742
赵五,赵五 13877776666
*/



insert into A
select * from B where not exists(select 1 from A where phone=b.phone)
select * from a
/*
鬼子六 3322152
李四,麻子 13088889999
张三,石头 5566742
赵五,赵五 13877776666
泡泡 13900002222
*/
delete from a where exists (select 1 from b where phone=a.phone and name=a.name )
select * from a
/*
鬼子六 3322152
李四,麻子 13088889999
张三,石头 5566742
赵五,赵五 13877776666
*/

update a set name=case when charindex(',',name)>=1 then LEFT(name,charindex(',',name)-1) else name end

select * from a
/*
鬼子六 3322152
李四 13088889999
张三 5566742
赵五 13877776666
*/

drop table a
drop table b


Felixzhaowenzhong 2012-05-11
  • 打赏
  • 举报
回复

delete from A表 a where exists (select 1 from B表 where 电话=a.电话 and 姓名=a.姓名 )

update A表 set 姓名=case when charindex(',',姓名)>=1 then LEFT(姓名,charindex(',',姓名)-1) else 姓名 end

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧