改写rownum的问题

icecools 2013-06-11 10:22:40
我有2个表,一个是Data, 里面有personId, name, date等字段,这个表比较小,最多几千条记录,另外一个是person表,里面有id, name等,这个表很大,有上千万条记录,并且有少量id重复,其实就是一个身份证号对应2个名字(因为有人改过名字),现在有个需求是用person表里的name来更新Data表里的名字,Oracle的语句大概如下:
update Data set name = (select name from person where person.id = personId and rownum = 1) where date = '2013-01-23'
这样就是如果person里同一个id有2个名字那就用第一条记录的name来更新。这个没有问题。现在我们有需求把他改成别的数据库语句来写,里面没有rownum这个关键字,我尝试用
update Data set name = (select top 1 name from person where person.id = Data.id ) where date = '2013-01-23'
来写,但是语法错误,说是相关子查询里不能有排序,所以现在想到的是用inner join:
update data set name = pname from data inner join (select min(name), id from person group by id) b on b.id = personId where date = '2013-01-23'
这个可以工作,但是很慢,因为group by的时候有上千万个分组,但实际要更新的数据只有几十条。所以不知道各位高手有没有这方面的经验,有什么简单的办法可以实现这个功能?谢谢!
一次只能给100分,如果解决可以另开贴给分,现在就卡在这里了。。。
...全文
150 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
---涛声依旧--- 2013-06-14
  • 打赏
  • 举报
回复
建议楼学一下ABAP
BzTech_123 2013-06-13
  • 打赏
  • 举报
回复

update Data set name = (select name from person UP TO 1 ROWS where person.id = Data.id ORDER BY person.name ) where date = '2013-01-23'
BzTech_123 2013-06-12
  • 打赏
  • 举报
回复
Update data set name=t.name From data d cross apply (select top 1 name from person p where p.id=d.id) t
icecools 2013-06-12
  • 打赏
  • 举报
回复
引用 5 楼 ejason 的回复:

UPDATE d 
SET name = p.person
FROM Data d INNER JOIN  (select top 1 id,name from person  order by id asc ) P
ON D.personId  = P.id
WHERE d.date = '2013-01-23'
这个不对呀,P里面永远只有一条。。。
icecools 2013-06-12
  • 打赏
  • 举报
回复
引用 6 楼 ap0405140 的回复:
请问"别的数据库"是什么数据库呢? Oracle里有rownum, SQL Server里有row_number(), 其他数据库也应该有相对应的函数或替代的方法的.
SAP的新的数据库,没有row_number这个玩意,所以很烦。。。。
唐诗三百首 2013-06-12
  • 打赏
  • 举报
回复
请问"别的数据库"是什么数据库呢? Oracle里有rownum, SQL Server里有row_number(), 其他数据库也应该有相对应的函数或替代的方法的.
铁歌 2013-06-12
  • 打赏
  • 举报
回复

UPDATE d 
SET name = p.person
FROM Data d INNER JOIN  (select top 1 id,name from person  order by id asc ) P
ON D.personId  = P.id
WHERE d.date = '2013-01-23'
icecools 2013-06-12
  • 打赏
  • 举报
回复
引用 2 楼 hgwyl 的回复:
按照所说的,如果person里同一个id有2个名字那就用第一条记录的name来更新 person表是记录表,记录每一次姓名的变更;data表是直接使用的当前姓名 实际业务中应该是data表数据不完整,想从person表更新过去 这个操作其实只是操作一次,也就是将data表初始化,这个过程稍微慢一些无所谓的吧 除非说整个程序每次更改姓名时没控制好,只修改了person表而没有修改data表——如果真是这样就是程序缺陷,改改程序避免两个表不同步。
现在的问题是不能改表结构和逻辑,我们要在别的数据库上测试性能和Oracle比较,所以这个还是很重要的。。。 我是简化了一下问题,其实Data表是业务表,里面每天都要根据person来更新name, 这个操作经常做,所以跑一个月数据下来这个地方就很慢了。。。
icecools 2013-06-12
  • 打赏
  • 举报
回复
引用 1 楼 u010933793 的回复:
Update data set name=t.name From data d cross apply (select top 1 name from person p where p.id=d.id) t
谢谢,但是我用的不是sql server, 请问有通用的解决方法吗?
hgwyl 2013-06-12
  • 打赏
  • 举报
回复
按照所说的,如果person里同一个id有2个名字那就用第一条记录的name来更新 person表是记录表,记录每一次姓名的变更;data表是直接使用的当前姓名 实际业务中应该是data表数据不完整,想从person表更新过去 这个操作其实只是操作一次,也就是将data表初始化,这个过程稍微慢一些无所谓的吧 除非说整个程序每次更改姓名时没控制好,只修改了person表而没有修改data表——如果真是这样就是程序缺陷,改改程序避免两个表不同步。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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