17,377
社区成员
发帖
与我相关
我的任务
分享
create table as test (select * from (
select * from (
select t.*, t1.*, t2.*
from (select level as id from dual connect by level < 20 ) t
left join (select *
from (select level as t_id from dual connect by level < 20) tt
where tt.t_id not in (3, 4, 6, 8, 11, 12, 17)
) t1 on t.id = t1.t_id
left join (select *
from (select level as tid from dual connect by level < 20) tt
where tt.tid in (3, 4, 6, 8, 11, 12, 17)) t2 on t.id = t2.tid) order by id )
;
create table t as (
select id i_d,c_ from (
select t.*,id-t_id as c_ from (
select id , rownum t_id , tid from (
select * from test where tid is not null order by id )) t));
update test set t_id = id where t_id is null and id < (
select id + cc_
from (select tt.*,
row_number() over(partition by t_id, c_ order by id desc) cc_
from (select t1.*, t.*
from test t1
left join t on t1.id = t.i_d
order by t1.id) tt
order by id)
where id in
( select min(id)
from (select tt.*,
row_number() over(partition by t_id, c_ order by id desc) cc_
from (select t1.*, t.*
from test t1
left join t on t1.id = t.i_d
order by t1.id) tt
order by id)
where t_id is null )
);
写了一小时,呵呵 估计要是我面试的话,就over了,o(∩_∩)o...
这个应该可以实现了,一次只填一个连续的空.
INSERT INTO t(id)
SELECT LEVEL + id1
FROM (SELECT MIN(id) id1, MIN(lid) id2
FROM (SELECT id, lead(id) over(ORDER BY id) lid FROM t)
WHERE lid - id <> 1)
CONNECT BY LEVEL < id2 - id1
CREATE TABLE t(ID NUMBER(2));
INSERT INTO t VALUES(1);
INSERT INTO t VALUES(2);
INSERT INTO t VALUES(3);
INSERT INTO t VALUES(5);
INSERT INTO t VALUES(6);
INSERT INTO t VALUES(9);
INSERT INTO t VALUES(11);
COMMIT;
DECLARE
v_1 NUMBER(2);
v_2 NUMBER(2);
v_3 NUMBER(2);
BEGIN
v_1:=1;
LOOP
SELECT COUNT(*) INTO v_2 FROM t WHERE ID = v_1;
EXIT WHEN v_2=0;
v_1:=v_1+1;
END LOOP;
SELECT MIN(ID) INTO v_3 FROM t WHERE ID >v_1;
FOR i IN v_1..v_3-1 LOOP
INSERT INTO t(ID) VALUES(i);
END LOOP;
COMMIT;
END;
/
SELECT * FROM t ORDER BY ID;
create table test(id number);
insert into TEST (ID)values (1);
insert into TEST (ID)values (2);
insert into TEST (ID)values (3);
insert into TEST (ID)values (4);
insert into TEST (ID)values (8);
insert into TEST (ID)values (9);
insert into TEST (ID)values (10);
--
insert into test
select id-1 from (select id,num from (select id,rownum num from (select id from test order by id) t))
where id!=num and rownum=1;
insert into testqf
select rn
from (select rownum rn from testqf )
where rn <
(
select min(id)
from (select id, rownum rn from (select id from testqf order by id))
where id <> rn)
and rn >
(select max(id)
from (select id, rownum rn from (select id from testqf order by id))
where id = rn)
insert into t
WITH tmp1 AS(
SELECT max(id)+1 startid
FROM t
START WITH ID=1
CONNECT BY ID=PRIOR ID+1)
,tmp2 AS(
SELECT MIN(ID)-1 endid
FROM t
WHERE ID>(SELECT startid FROM tmp1))
SELECT startid+ROWNUM-1 FROM tmp1
connect by rownum<=(select endid-tmp1.startid+1 from tmp2);