请问Oracle更新表,如果a,b,c三个字段相同更新第四个字段

shiter
人工智能领域优质创作者
博客专家认证
2016-12-14 05:53:14
有两种情况,数据在同一个表中,第四个字段是时间,我想保留时间最新得一条记录其他删除,请问应该怎么写,求个语句例子
...全文
320 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiter 2016-12-15
  • 打赏
  • 举报
回复
引用 5 楼 wmxcn2000 的回复:

SQL> 
SQL> create table test(
  2  name varchar(10), mob varchar(20), cardid varchar(30), crdate varchar(10));
Table created
SQL> begin
  2      insert into test values('王大力','159000000','61033333333333','20130720');
  3      insert into test values('王大力','159000000','61033333333333','20130722');
  4  end;
  5  /
PL/SQL procedure successfully completed
SQL> -- 删除
SQL> delete test
  2  where exists(
  3   select * from test t where test.name = t.name and test.crdate < t.crdate
  4   );
1 row deleted
SQL> select * from test;
NAME       MOB                  CARDID                         CRDATE
---------- -------------------- ------------------------------ ----------
王大力     159000000            61033333333333                 20130722
SQL> -- 更新
SQL> merge into test t
  2  using (select '王大力' name,
  3                '159000000' mob,
  4                '61033333333333' cardid,
  5                '20130723' crdate from dual) m
  6  on(t.name = m.name)
  7  when matched then
  8  update set crdate = m.crdate
  9  when not matched then
 10  insert (name , mob , cardid , crdate) values(m.name , m.mob , m.cardid , m.crdate);
1 row merged
SQL> select * from test;
NAME       MOB                  CARDID                         CRDATE
---------- -------------------- ------------------------------ ----------
王大力     159000000            61033333333333                 20130723
SQL> drop table test purge;
Table dropped

SQL> 
问下大神用的是Oracle么,删除的时候报错呀,未完城的语句
H_Gragon 2016-12-15
  • 打赏
  • 举报
回复
引用 5 楼 wmxcn2000 的回复:

SQL> 
SQL> create table test(
  2  name varchar(10), mob varchar(20), cardid varchar(30), crdate varchar(10));
Table created
SQL> begin
  2      insert into test values('王大力','159000000','61033333333333','20130720');
  3      insert into test values('王大力','159000000','61033333333333','20130722');
  4  end;
  5  /
PL/SQL procedure successfully completed
SQL> -- 删除
SQL> delete test
  2  where exists(
  3   select * from test t where test.name = t.name and test.crdate < t.crdate
  4   );
1 row deleted
SQL> select * from test;
NAME       MOB                  CARDID                         CRDATE
---------- -------------------- ------------------------------ ----------
王大力     159000000            61033333333333                 20130722
SQL> -- 更新
SQL> merge into test t
  2  using (select '王大力' name,
  3                '159000000' mob,
  4                '61033333333333' cardid,
  5                '20130723' crdate from dual) m
  6  on(t.name = m.name)
  7  when matched then
  8  update set crdate = m.crdate
  9  when not matched then
 10  insert (name , mob , cardid , crdate) values(m.name , m.mob , m.cardid , m.crdate);
1 row merged
SQL> select * from test;
NAME       MOB                  CARDID                         CRDATE
---------- -------------------- ------------------------------ ----------
王大力     159000000            61033333333333                 20130723
SQL> drop table test purge;
Table dropped

SQL> 
卖水果的net 2016-12-15
  • 打赏
  • 举报
回复
引用 6 楼 wangyaninglm 的回复:
问下大神用的是Oracle么,删除的时候报错呀,未完城的语句
什么错,你倒是贴上来啊。。
卖水果的net 2016-12-14
  • 打赏
  • 举报
回复

SQL>
SQL> create table test(
2 name varchar(10), mob varchar(20), cardid varchar(30), crdate varchar(10));
Table created
SQL> begin
2 insert into test values('王大力','159000000','61033333333333','20130720');
3 insert into test values('王大力','159000000','61033333333333','20130722');
4 end;
5 /
PL/SQL procedure successfully completed
SQL> -- 删除
SQL> delete test
2 where exists(
3 select * from test t where test.name = t.name and test.crdate < t.crdate
4 );
1 row deleted
SQL> select * from test;
NAME MOB CARDID CRDATE
---------- -------------------- ------------------------------ ----------
王大力 159000000 61033333333333 20130722
SQL> -- 更新
SQL> merge into test t
2 using (select '王大力' name,
3 '159000000' mob,
4 '61033333333333' cardid,
5 '20130723' crdate from dual) m
6 on(t.name = m.name)
7 when matched then
8 update set crdate = m.crdate
9 when not matched then
10 insert (name , mob , cardid , crdate) values(m.name , m.mob , m.cardid , m.crdate);
1 row merged
SQL> select * from test;
NAME MOB CARDID CRDATE
---------- -------------------- ------------------------------ ----------
王大力 159000000 61033333333333 20130723
SQL> drop table test purge;
Table dropped

SQL>
shiter 2016-12-14
  • 打赏
  • 举报
回复
引用 2 楼 wmxcn2000 的回复:
给出测试数据,和你想要的结果;
大神求帮助
shiter 2016-12-14
  • 打赏
  • 举报
回复
表a,表结构(姓名,手机,身份证,更新时间) 王大力,159000000,61033333333333,20130720 王大力,159000000,61033333333333,20130722 一种情况是想把表a中第一条记录删除,因为第一条记录的时间比较老 result: 王大力,159000000,61033333333333,20130722 另一种情况是,来了一条新记录 表b中: 王大力,159000000,61033333333333,20160723 插入表a时候,把原来的记录,第四个字段更新成这一条新记录的时间 表a: result 王大力,159000000,61033333333333,20160723
卖水果的net 2016-12-14
  • 打赏
  • 举报
回复
给出测试数据,和你想要的结果;
shiter 2016-12-14
  • 打赏
  • 举报
回复
另一种情况就是,数据来自其他表,也是如果a,b,c相同,则更新d

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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