CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Oracle >  基础和管理

新手问一个关于sql插入、修改、删除的问题

楼主demonwinwin(节日快乐)2005-04-02 00:53:04 在 Oracle / 基础和管理 提问

有表A(id,name,area,pay....)、表B(id,name,area),表中id字段为关键字段  
  要把符合条件pay=n的表A的记录插入表B,如果B中有记录的id和要插入的数据id相同,则判断name、area是否一致,不一致则修改B的那条记录的name、area,一致则不操作;如果表B中记录的id在表A中已经没有,则删除该条B中该记录  
   
  我该怎么写上述条件的过程?如果表中有上百万数据的话,哪种方法快?求助 问题点数:40、回复次数:16Top

1 楼huangyan168168(jolin)回复于 2005-04-02 09:48:48 得分 1

upTop

2 楼samkuang(执着前行)回复于 2005-04-02 10:15:39 得分 1

upTop

3 楼bluecocoqd(小骗骗)回复于 2005-04-02 11:46:12 得分 8

你的目的最终是对A和B中id相同,且pay=n的记录插入要B表中  
  create   table   B2   as   select   id   from   B;  
  truncate   table   B;  
  insert   into   B(id,name,area)   (select   A.id,A.name,A.area   from   A,B2   where   B2.id=   A.id  
  and   a.pay   =   n)  
  Top

4 楼bluecocoqd(小骗骗)回复于 2005-04-02 11:46:48 得分 0

应该这3个操作就能达到你所要的目的Top

5 楼demonwinwin(节日快乐)回复于 2005-04-02 23:20:02 得分 0

谢谢   bluecocoqd(小骗骗)  
  不过  
  表A有上百万的数据每天要把符合一定条件的记录的一些字段值存入表B,  
  如果每天都truncate,会不会不太好啊,有碎片多?  
  还有,种种原因不需要用触发器  
  能不能有其他的方法呢?Top

6 楼kulama2004(kulama)回复于 2005-04-03 13:10:45 得分 28

用Merge  
   
  MERGE   INTO   table_b   as   B  
  USING   (   select   *   from   A   where   A.pay   =   'n'   )   as   Temp  
  ON   (   B.ID   =   Temp.ID   )  
   
  WHEN   MATCHED   THEN  
      UPDATE   B   SET  
              B.name   =   Temp.name,  
              B.area   =   Temp.area  
   
  WHEN   NOT   MATCHED   THEN  
      INSERT   INTO   B   (   id,   name,   area   )  
          VALUES   (   Temp.id,   Temp.name,   Temp.area   );Top

7 楼kulama2004(kulama)回复于 2005-04-03 13:12:45 得分 0

truncate   B会带来问题的,因为B当中可能有与A中根本不匹配的ID存在,truncate之后会造成数据丢失  
  而且,无法rollbackTop

8 楼demonwinwin(节日快乐)回复于 2005-04-03 14:02:23 得分 0

谢谢:kulama2004(kulama)  
  “truncate   B会带来问题的,因为B当中可能有与A中根本不匹配的ID存在,truncate之后会造成数据丢失  
  而且,无法rollback”  
  可能我没表述清楚  
  B中如果有与A中不匹配的ID存在,则应该在B中删除此ID。  
  truncate无法rollback  
  不过如果用delete   是不是太慢了呢?    
  Top

9 楼kulama2004(kulama)回复于 2005-04-03 17:05:54 得分 0

问题是。。你truncate之后,B就变成空表了  
  一条记录都没有,还怎么知道  
   
  --“如果B中有记录的id和要插入的数据id相同,则判断name、area是否一致”  
   
  你应该先把不同的纪录都删了,然后update所有id相同的纪录,使name、area一致  
   
  1.delete   from   B   where   B.id   not   in   (select   A.id   from   A   where   A.pay   =   n)  
   
  2.insert   into   B(id,name,area)   (select   A.id,A.name,A.area   from   A   where   A.id   in   (   select   B2.id   from   B   B2   )   and   A.pay   =   n)Top

10 楼kulama2004(kulama)回复于 2005-04-03 17:12:38 得分 0

不好意思2写错  
   
  2.update   B   set    
          B.name   =   (select   A.name   from   A   where   A.id   =   B.id   and   A.pay   =   n),  
          B.area   =   (select   A.area   from   A   where   A.id   =   B.id   and   A.pay   =   n)  
  Top

11 楼kulama2004(kulama)回复于 2005-04-03 17:14:18 得分 0

还有一点你必须要保证id   在A表中是unique   key或者primary   keyTop

12 楼Engineer_develop(forest's sth)回复于 2005-04-03 18:46:24 得分 1

delete   update   insert   不提交的话回使用临时区域.上百万条数据可能会让你做不成.Top

13 楼Engineer_develop(forest's sth)回复于 2005-04-03 18:47:52 得分 1

建议考虑一下ROWID然后做个存储过程.Top

14 楼demonwinwin(节日快乐)回复于 2005-04-04 15:32:58 得分 0

谢谢大家    
  说的都不错Top

15 楼czrain(蝴蝶剑)回复于 2005-04-04 16:26:28 得分 0

truncate表不会产生碎片,delete才会产生!  
  truncate   表B  
  insert   into   表B  
  select   distinct   id,name,area   from   表A  
  where   pay=n  
   
  我想你要实现的就是上面的操作吧!Top

16 楼demonwinwin(节日快乐)回复于 2005-04-05 09:11:45 得分 0

到底我结贴了没有啊  
  昨天结贴的时候出错  
  现在这个贴在我登陆的时候是打勾的,不过怎么看起来有和以前结过的贴不一样啊?  
  现在已经不能结贴了Top

相关问题

  • 用ADO。NET如何更新数据(插入、删除、修改)?
  • 关于BLOB的插入,修改和删除
  • Remoting(TCP)如何传递Datatable中修改(更新、删除、插入)了的数据?
  • sql删除以及插入语句求助
  • sql删除以及插入语句求助
  • 求SQL语句实现添加,修改,删除字段
  • Access数据库中插入,修改SQL语句怎么写?
  • 如何用VC++的ADO实现向SQLSERVR中存取图片,并进行操作(插入,删除,修改)
  • 如何在Web开发中对数据库进行插入,修改,更新,删除和显示操作?
  • 通过 Button在 Grid中插入 ,修改,删除!怎么实现呀(在线等,分不够再加)!!

关键词

  • 字段
  • 数据
  • area
  • truncate
  • 插入
  • pay
  • 表
  • 删除
  • 记录
  • 一致

得分解答快速导航

  • 帖主:demonwinwin
  • huangyan168168
  • samkuang
  • bluecocoqd
  • kulama2004
  • Engineer_develop
  • Engineer_develop

相关链接

  • Oracle类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo