首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 求SQL更新语句
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-25 17:03:16 楼主
    表1
    ===============================
    BEGIN  IN  OUT END DATE
    100    10  20      2008-07-01 
            20  30      2008-07-02
            50  20      2008-07-03

    表2
    ===============================               
    BEGIN  IN  OUT END DATE
    100    10  20  90  2008-07-01 
    90      20  30  80  2008-07-02
    80      50  20  110 2008-07-03

    END = BEGIN + IN - OUT
    BEGIN = 上一天END

    请问如何用一条SQL将表1更新到表2?
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-25 17:03:221楼 得分:0
    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【CHARGING】截止到2008-07-25 17:03:26的历史汇总数据(不包括此帖):
    发帖的总数量:5                        发帖的总分数:520                      每贴平均分数:104                     
    回帖的总数量:7                        得分贴总数量:2                        回帖的得分率:28%                     
    结贴的总数量:5                        结贴的总分数:520                     
    无满意结贴数:0                        无满意结贴分:0                       
    未结的帖子数:0                        未结的总分数:0                       
    结贴的百分比:100.00%              结分的百分比:100.00%                 
    无满意结贴率:0.00  %              无满意结分率:0.00  %                 
    敬礼!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-25 17:11:012楼 得分:0
    "表1", "表2"应该是"更新前", "更新后"比较恰当:)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-25 17:28:163楼 得分:0
    帮忙
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-25 17:29:304楼 得分:0
    就是说嘛,说明白撒,呵呵,我来给你弄,100分给我了,=
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-25 17:44:145楼 得分:0
    这种树形结构 更新一条语句的确很难搞定哦。晕
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-25 17:49:366楼 得分:0
    搞定了再给100分都没问题啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-25 18:03:187楼 得分:0
    要用一条语句把表1变成 表2  对否??
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-25 18:13:048楼 得分:0
    学习。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-25 20:00:229楼 得分:0
    to: JavaLover00000
    没错
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-25 20:01:1410楼 得分:0
    看了一下,没看明白喃。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-25 23:03:0611楼 得分:0
    update table1 set BEGIN = (nvl(BEGIN,select END from table1 where DATE = trunc(DATE)-1)), END = (nvl(BEGIN,select END from table1 where DATE = trunc(DATE)-1)+IN-OUT);

    不知道是否可以运行 手边没有oracle环境. 大概思路就是这个了,子查询应该可以优化.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-26 09:42:5712楼 得分:0
    楼上的, 貌似不行啊, 我的是MySQL, 换成对应的函数也执行不了.
    update test a set a.e_begin = ifnull(a.e_begin, (select b.e_end from test b where b.demand_date=date_add(a.demand_date, interval -1 day))),
    a.e_end=ifnull(a.e_end, ((select c.e_end from test c where c.demand_date = date_add(a.demand_date, interval -1 day)) + a.e_in - a.e_out));

    Error Code : 1093
    You can't specify target table 'a' for update in FROM clause
    (0 ms taken)

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-26 18:02:5213楼 得分:0
    本人在mysql5.0下调试过,可行。

    insert into test2
      (select (select max(begin) from test) +
              IFNULL((select sum(t.IN) - sum(t.OUT)
                      from test t
                      where t.DATE < tt.DATE),
                    0) begin,
              tt.in,
              tt.out,
              (select max(begin) from test) +
              (select sum(t.IN) - sum(t.OUT) from test t where t.DATE <= tt.DATE) end,
              tt.date
        from test tt)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-26 18:25:0314楼 得分:0
    先select 后insert
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bootupnow
    • 等级:
    发表于:2008-07-26 19:55:3515楼 得分:0
    考虑用procedure来实现
    mssql版本,用了cursor,破方法。
    SQL code
    -- 建表 create table t1( b int, i int, o int, e int, d datetime default getdate() ) -- 插入数据 insert into t1 select 100,10,20,null,'2008-07-01' union all select null,20,30,null,'2008-07-02' union all select null,50,20,null,'2008-07-03' union all select null,50,20,null,'2008-07-04' -- 存储过程 create procedure prDoSomething as declare @b int, @i int, @o int, @e int, @d datetime declare cur cursor for select b,i,o,d from t1 open cur fetch next from cur into @b,@i,@o,@d while(@@fetch_status = 0) begin update t1 set e = @b + @i - @o where d = @d update t1 set b = @b + @i - @o where d = (select min(d) from t1 where d > @d) fetch next from cur into @b,@i,@o,@d end close cur deallocate cur -- 执行procedure exec prDoSomething -- 查询 select * from t1 -- 清理 drop table t1 drop procedure prDoSomething


    BatchFile code
    b i o e d ----------- ----------- ----------- ----------- ----------------------- 100 10 20 90 2008-07-01 00:00:00.000 90 20 30 80 2008-07-02 00:00:00.000 80 50 20 110 2008-07-03 00:00:00.000 110 50 20 140 2008-07-04 00:00:00.000 (所影响的行数为 4 行)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bootupnow
    • 等级:
    发表于:2008-07-26 19:58:1416楼 得分:0
    lz可以去MSSQL版提问寻求更好的方法,传说那里是CSDN最为强大的地方,hoho~
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved