请教个update语句

ifvlr 2018-03-06 07:45:06
oracle中有一个表,表中的数据是这样子的
此处用excel模拟展示出来 而我想把数据更新为如下这个样子

当然,数据有很多,远不止我列出的这些。
简单的说,就是把仓库编号和仓库简称为空的补全,补全到小计位置截止,与后面的年度,等级什么的都没关系。如果某仓库只存储了一条记录,则不用补全。如C仓库那样
如何能用SQL语句把图一的记录更新为图二的记录呢?
...全文
566 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
chengccy 2018-03-07
  • 打赏
  • 举报
回复

MERGE JOIN TABLE A
USING (SELECT ROWID AS PK_ID,
              NVL(仓库编号, LAG(仓库编号 IGNORE NULLS) OVER(ORDER BY ID)) 仓库编号,
              DECODE(仓库编号, '小计', 仓库简称,
                      NVL(仓库简称, LAG(仓库简称 IGNORE NULLS) OVER(ORDER BY ID))) AS 仓库简称
       FROM   TABLE) B
ON (A.ROWID = B.PK_ID)
WHEN MATCHED THEN
  UPDATE
  SET    A.仓库编号 = B.仓库编号, A.仓库简称 = B.仓库简称;
如果有一个ID顺序列的话,可以按照这个来做
ifvlr 2018-03-07
  • 打赏
  • 举报
回复
引用 3 楼 baidu_36457652 的回复:
[quote=引用 2 楼 ifvlr 的回复:] [quote=引用 1 楼 baidu_36457652 的回复:] 我们这样说吧,数据里面没有主键或者唯一能确定的字段。你怎么确定仓库编号和仓库简称为空的是哪个仓库的? 你这个直接查询的顺序不能说明, 任何顺序问题的。不能向excel 表 排列那样理解
这些数据,本来就是从excel中导入到Oracle中的,因为Excel很多,我就写了个脚本导入的。主键本应该是仓库编号,年度,等级,产地四个。但是仓库编号,做表的人图方便,就只写了一行,那么空的就无法做主键了。 当然,我可以用程序在数据库中增加一个id列,并按照Excel中记录顺序序列递增数据。这样的话,能否按照我说的方式update记录。[/quote] 那就可以[/quote] 所以 怎么写呢?我没有想到好方法
ifvlr 2018-03-07
  • 打赏
  • 举报
回复
引用 1 楼 baidu_36457652 的回复:
我们这样说吧,数据里面没有主键或者唯一能确定的字段。你怎么确定仓库编号和仓库简称为空的是哪个仓库的? 你这个直接查询的顺序不能说明, 任何顺序问题的。不能向excel 表 排列那样理解
这些数据,本来就是从excel中导入到Oracle中的,因为Excel很多,我就写了个脚本导入的。主键本应该是仓库编号,年度,等级,产地四个。但是仓库编号,做表的人图方便,就只写了一行,那么空的就无法做主键了。 当然,我可以用程序在数据库中增加一个id列,并按照Excel中记录顺序序列递增数据。这样的话,能否按照我说的方式update记录。
  • 打赏
  • 举报
回复
引用 2 楼 ifvlr 的回复:
[quote=引用 1 楼 baidu_36457652 的回复:] 我们这样说吧,数据里面没有主键或者唯一能确定的字段。你怎么确定仓库编号和仓库简称为空的是哪个仓库的? 你这个直接查询的顺序不能说明, 任何顺序问题的。不能向excel 表 排列那样理解
这些数据,本来就是从excel中导入到Oracle中的,因为Excel很多,我就写了个脚本导入的。主键本应该是仓库编号,年度,等级,产地四个。但是仓库编号,做表的人图方便,就只写了一行,那么空的就无法做主键了。 当然,我可以用程序在数据库中增加一个id列,并按照Excel中记录顺序序列递增数据。这样的话,能否按照我说的方式update记录。[/quote] 那就可以
  • 打赏
  • 举报
回复
楼上的方法就很好, 用 last_value也好用 merge into (SELECT ROWID AS AID, M.* FROM TABLE1 M WHERE M.仓库简称 IS NULL) A USING (SELECT ROWID AS BID,LAST_VALUE(仓库编号 IGNORE NULLS) OVER(ORDER BY ID) AS 仓库编号1, LAST_VALUE(仓库简称 IGNORE NULLS) OVER(ORDER BY ID) AS 仓库简称1 FROM TABLE1)B ON (A.AID=B.BID) WHEN MATCHED THEN UPDATE SET A.仓库编号=B.仓库编号1,A.仓库简称=B.仓库简称1
  • 打赏
  • 举报
回复
我们这样说吧,数据里面没有主键或者唯一能确定的字段。你怎么确定仓库编号和仓库简称为空的是哪个仓库的? 你这个直接查询的顺序不能说明, 任何顺序问题的。不能向excel 表 排列那样理解

17,140

社区成员

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

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