暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 如何根据条件将一行拆分为2行。

askTom 2016-04-25
346

问题描述

你好,

我希望将一条记录拆分为2个记录,并创建了测试数据以及完成记录拆分的前2个选择语句。

https://livesql.oracle.com/apex/livesql/s/c7den2h6h4xfynztri9kvkoge

两种尝试都执行笛卡尔连接,第一种情况是针对所有数据,其次是仅针对匹配拆分条件的数据(col2n>col1n)。

我的data_rows表将有数百万条记录,并且期望只有几千条记录符合拆分标准。

有没有更好的方法来做分割而不做笛卡尔连接?

谢谢!
艾萨克

专家解答

你的笛卡尔连接距离对偶只有2行,所以我不会太担心。我会避免工会的所有方式:这可能导致两次全表扫描。

可以使用case表达式将其转换为连接。这个:

-比较列
-根据需要返回1或2
-将此连接到双行

create table data_row 
( 
 col1  varchar2(30) 
,col2  varchar2(20) 
,col1n number 
,col2n number 
,col3c varchar2(20) 
);

insert into data_row 
values ('plant','cactus',3,4,'special plant');

insert into data_row 
values ('plant','mint',3,2,'plant');

with rws as (
  select rownum r from dual connect by level <= 2
)
  select * 
  from   data_row
  join   rws
  on     case when col2n > col1n then 2 else 1 end <= rws.r;

COL1                           COL2                      COL1N      COL2N COL3C                         R
------------------------------ -------------------- ---------- ---------- -------------------- ----------
plant                          mint                          3          2 plant                         1
plant                          cactus                        3          4 special plant                 2
plant                          mint                          3          2 plant                         2


也可以在LiveSQL中查看:

https://livesql.oracle.com/apex/livesql/file/content_C7JRMG59WU7K8BVE3F837F9VW.html

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论