问题描述
你好,
我希望将一条记录拆分为2个记录,并创建了测试数据以及完成记录拆分的前2个选择语句。
https://livesql.oracle.com/apex/livesql/s/c7den2h6h4xfynztri9kvkoge
两种尝试都执行笛卡尔连接,第一种情况是针对所有数据,其次是仅针对匹配拆分条件的数据(col2n>col1n)。
我的data_rows表将有数百万条记录,并且期望只有几千条记录符合拆分标准。
有没有更好的方法来做分割而不做笛卡尔连接?
谢谢!
艾萨克
我希望将一条记录拆分为2个记录,并创建了测试数据以及完成记录拆分的前2个选择语句。
https://livesql.oracle.com/apex/livesql/s/c7den2h6h4xfynztri9kvkoge
两种尝试都执行笛卡尔连接,第一种情况是针对所有数据,其次是仅针对匹配拆分条件的数据(col2n>col1n)。
我的data_rows表将有数百万条记录,并且期望只有几千条记录符合拆分标准。
有没有更好的方法来做分割而不做笛卡尔连接?
谢谢!
艾萨克
专家解答
你的笛卡尔连接距离对偶只有2行,所以我不会太担心。我会避免工会的所有方式:这可能导致两次全表扫描。
可以使用case表达式将其转换为连接。这个:
-比较列
-根据需要返回1或2
-将此连接到双行
也可以在LiveSQL中查看:
https://livesql.oracle.com/apex/livesql/file/content_C7JRMG59WU7K8BVE3F837F9VW.html
可以使用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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




