免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4358 | 回复: 12
打印 上一主题 下一主题

求助一SQL语句写法? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-21 08:15 |只看该作者 |倒序浏览
表1 hzb(两个字段为帐号和余额)
zh                      ye
214256           20.00
214378           1000.00
表2 lsz(三个字段 帐号,存取日,余额)
zh                       cqr                ye
214256          20071210        100.00
214256          20071220         200.00
214378          20071201         10.00
214378          20071213         1200.00

我想通过update让表1中 ye 字段值更改为表2中cqr 为最大的余额值.更新条件是两表中帐号相同?最后表1结果为:不知我说的是否明白?
zh                      ye
214256           200.00
214378           1200.00

论坛徽章:
0
2 [报告]
发表于 2007-12-21 08:38 |只看该作者
update hzb a set a.ye=(select ye from lsz b where a.zh=b.zh and b.cqr=(select max(cqr) from lsz where a.zh=lsz.zh));


当你的lsz 中的cqr 在zh相同的时候有相同的值 就会出错的....  先确定你的cqr在相同zh中没有重复值

[ 本帖最后由 managergh 于 2007-12-21 08:45 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-12-21 09:01 |只看该作者
select cqr from(select cqr from lsz where zh=214256 order by cqr desc) where rownum=1;


这是取有重复值的最大值的办法 要出去了 没时间了
:em11:

好运

论坛徽章:
0
4 [报告]
发表于 2007-12-21 19:02 |只看该作者
原帖由 managergh 于 2007-12-21 09:01 发表
select cqr from(select cqr from lsz where zh=214256 order by cqr desc) where rownum=1;


这是取有重复值的最大值的办法 要出去了 没时间了
:em11:

好运


肯定有重复值了(lsz表中zh和cqr 相同的记录),能两个语句结合一下帮我写一下吗?谢谢

论坛徽章:
0
5 [报告]
发表于 2007-12-22 21:50 |只看该作者
select * from lsz a where
  not exists(select 1 from lsz where zh=a.zh and cqr >a.cqr and ye>a.ye)

这个可以选出lsz表中cqr最大并且ye也最大

论坛徽章:
0
6 [报告]
发表于 2007-12-24 09:02 |只看该作者
肯定有重复值了(lsz表中zh和cqr 相同的记录),而且zh,cqr,ye 最大同时相同的记录也会有的。只要能任取一个就可以了。managergh 能两个语句结合一下帮我写一下吗?谢谢

论坛徽章:
0
7 [报告]
发表于 2007-12-25 08:55 |只看该作者
也许是我说明白
主要是问你的cqr 有重复值么?

这是个充值表吧?

要把这个人最后一次充值写到第一个表中. 把后面表的最后一天的 最大的余额写到第一个表中 对么

论坛徽章:
0
8 [报告]
发表于 2007-12-25 10:54 |只看该作者

回复 #1 jlsyyz 的帖子

with slct_ye as
  select ye, zh
    from (
      select ye, zh,
      rank () over (
        partition by zh
        order by cqr desc, ye desc, rowid desc
      ) as rnk
      from lsz
    ) x
    where x.rnk = 1
update hzb t
set ye = (
  select ye
    from slct_ye
    where zh = t.zh
)
where exists (
  select 1
    from slct_ye
    where zh = t.zh
)
;

论坛徽章:
0
9 [报告]
发表于 2007-12-25 10:59 |只看该作者
如果lsz那个表很大,
可以考虑把其后的update子句换成merge,同时with换成一个临时表,对zh字段建立唯一索引。
接着merge,应该会快不少。

论坛徽章:
0
10 [报告]
发表于 2007-12-26 08:53 |只看该作者
根据 楼上 ivhb  
写的改了一下  

update hzb a set a.ye=(select ye from(
select ye, zh,
      rank () over (
        partition by zh
        order by cqr desc, ye desc, rowid desc
      ) as rnk
      from lsz)
where a.zh=zh and rnk=1
)

[ 本帖最后由 managergh 于 2007-12-26 09:13 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP