根据 table[Oracle SQL 查询中保存的记录生成动态记录]。请参考图片 link 了解要求
generate dynamic record based on the record saved in the table[Oracle SQL query]. Please refer the image link to know about the requirements
实际记录:
预期记录:
创建 table 和插入语句在这里:-
create table t11
(
id number,
name varchar2(20),
standard varchar2(20),
sdt date
);
insert into t11 values(1,'Ramakrushna',to_char(1,'RN'), sysdate);
insert into t11 values(1,'Ramakrushna',to_char(2,'RN'), sysdate);
insert into t11 values(2,'Ramakrushna',to_char(1,'RN'),sysdate);
insert into t11 values(2,'Ramakrushna',to_char(5,'RN'),sysdate);
insert into t11 values(3,'Ramakrushna',to_char(1,'RN'),sysdate);
动态记录是根据id生成的,应该会连同id一起生成8条记录。
保存在 table 中的记录就像,
对于 id 1 记录可以 i 和 iii 标准(罗马值),
但 id 1 的预期记录将是 i、ii、iii、iv、v、vi、vii、viii,其他 id 也一样,基于 table.
中的记录保存
这是我的方法,使用 with as 子句。它几乎不需要修改。
with t01 as (
select rownum rn,id,name,standard,sdt from t11
),
t02 as (
select rownum rn ,id,name,to_char(to_char(l,'RN')) as standard,sdt,l
from t01
left outer join (select level l from dual connect by level <= ((select max(rn) from t01) + 6)) lev on 1 = 1 -- passed 2 as argument
),
t03 as (
select t02.id,t02.name,t02.standard,t02.sdt,
row_number() over(partition by standard order by 1) rnk
from t02 where not exists (select 'Y' from t01 where t01.standard = t02.standard)
)
select id,name,standard,sdt from t03 where rnk = 1
union
select id,name,standard,sdt from t1;
如果 name
和 sdt
对于每个 id
都是常数,如示例数据所示,那么一个简单的方法是 select 不同的元组和使用递归查询生成所有数字:
with cte (id, name, standard, sdt) as (
select distinct id, name, 1, sdt from t11
union all
select id, name, standard + 1, sdt from cte where standard < 8
)
select id, name, to_char(standard, 'RN') standard, sdt
from cte
order by id, standard
我喜欢使用常见的 table 表达式而不是 connect by
,因为它们是标准的 SQL 并且在 Oraclce 中支持了相当长的时间,但逻辑只是与 connect by
:
相同
select distinct id, name, to_char(level, 'RN') standard, sdt
from t11
connect by level <= 8
order by id, standard
ID | NAME | STANDARD | SDT
-: | :---------- | :-------------- | :--------
1 | Ramakrushna | I | 10-JUN-20
1 | Ramakrushna | V | 10-JUN-20
1 | Ramakrushna | II | 10-JUN-20
1 | Ramakrushna | IV | 10-JUN-20
1 | Ramakrushna | VI | 10-JUN-20
1 | Ramakrushna | III | 10-JUN-20
1 | Ramakrushna | VII | 10-JUN-20
1 | Ramakrushna | VIII | 10-JUN-20
2 | Ramakrushna | I | 10-JUN-20
2 | Ramakrushna | V | 10-JUN-20
2 | Ramakrushna | II | 10-JUN-20
2 | Ramakrushna | IV | 10-JUN-20
2 | Ramakrushna | VI | 10-JUN-20
2 | Ramakrushna | III | 10-JUN-20
2 | Ramakrushna | VII | 10-JUN-20
2 | Ramakrushna | VIII | 10-JUN-20
3 | Ramakrushna | I | 10-JUN-20
3 | Ramakrushna | V | 10-JUN-20
3 | Ramakrushna | II | 10-JUN-20
3 | Ramakrushna | IV | 10-JUN-20
3 | Ramakrushna | VI | 10-JUN-20
3 | Ramakrushna | III | 10-JUN-20
3 | Ramakrushna | VII | 10-JUN-20
3 | Ramakrushna | VIII | 10-JUN-20
实际记录:
预期记录:
创建 table 和插入语句在这里:-
create table t11
(
id number,
name varchar2(20),
standard varchar2(20),
sdt date
);
insert into t11 values(1,'Ramakrushna',to_char(1,'RN'), sysdate);
insert into t11 values(1,'Ramakrushna',to_char(2,'RN'), sysdate);
insert into t11 values(2,'Ramakrushna',to_char(1,'RN'),sysdate);
insert into t11 values(2,'Ramakrushna',to_char(5,'RN'),sysdate);
insert into t11 values(3,'Ramakrushna',to_char(1,'RN'),sysdate);
动态记录是根据id生成的,应该会连同id一起生成8条记录。 保存在 table 中的记录就像, 对于 id 1 记录可以 i 和 iii 标准(罗马值), 但 id 1 的预期记录将是 i、ii、iii、iv、v、vi、vii、viii,其他 id 也一样,基于 table.
中的记录保存这是我的方法,使用 with as 子句。它几乎不需要修改。
with t01 as (
select rownum rn,id,name,standard,sdt from t11
),
t02 as (
select rownum rn ,id,name,to_char(to_char(l,'RN')) as standard,sdt,l
from t01
left outer join (select level l from dual connect by level <= ((select max(rn) from t01) + 6)) lev on 1 = 1 -- passed 2 as argument
),
t03 as (
select t02.id,t02.name,t02.standard,t02.sdt,
row_number() over(partition by standard order by 1) rnk
from t02 where not exists (select 'Y' from t01 where t01.standard = t02.standard)
)
select id,name,standard,sdt from t03 where rnk = 1
union
select id,name,standard,sdt from t1;
如果 name
和 sdt
对于每个 id
都是常数,如示例数据所示,那么一个简单的方法是 select 不同的元组和使用递归查询生成所有数字:
with cte (id, name, standard, sdt) as (
select distinct id, name, 1, sdt from t11
union all
select id, name, standard + 1, sdt from cte where standard < 8
)
select id, name, to_char(standard, 'RN') standard, sdt
from cte
order by id, standard
我喜欢使用常见的 table 表达式而不是 connect by
,因为它们是标准的 SQL 并且在 Oraclce 中支持了相当长的时间,但逻辑只是与 connect by
:
select distinct id, name, to_char(level, 'RN') standard, sdt
from t11
connect by level <= 8
order by id, standard
ID | NAME | STANDARD | SDT -: | :---------- | :-------------- | :-------- 1 | Ramakrushna | I | 10-JUN-20 1 | Ramakrushna | V | 10-JUN-20 1 | Ramakrushna | II | 10-JUN-20 1 | Ramakrushna | IV | 10-JUN-20 1 | Ramakrushna | VI | 10-JUN-20 1 | Ramakrushna | III | 10-JUN-20 1 | Ramakrushna | VII | 10-JUN-20 1 | Ramakrushna | VIII | 10-JUN-20 2 | Ramakrushna | I | 10-JUN-20 2 | Ramakrushna | V | 10-JUN-20 2 | Ramakrushna | II | 10-JUN-20 2 | Ramakrushna | IV | 10-JUN-20 2 | Ramakrushna | VI | 10-JUN-20 2 | Ramakrushna | III | 10-JUN-20 2 | Ramakrushna | VII | 10-JUN-20 2 | Ramakrushna | VIII | 10-JUN-20 3 | Ramakrushna | I | 10-JUN-20 3 | Ramakrushna | V | 10-JUN-20 3 | Ramakrushna | II | 10-JUN-20 3 | Ramakrushna | IV | 10-JUN-20 3 | Ramakrushna | VI | 10-JUN-20 3 | Ramakrushna | III | 10-JUN-20 3 | Ramakrushna | VII | 10-JUN-20 3 | Ramakrushna | VIII | 10-JUN-20