For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!
Hello gurus,
How would one drop a materialized view in 9i but preserve the table?
Thank you,
-- -- Data: with demo as ( select 123 emp_id, TO_DATE('01.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS') working_day, '_' active_code from dual union all select 123, TO_DATE('02.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS'), '_' from dual union all select 123, TO_DATE('03.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS'), 'K' from dual union all select 123, TO_DATE('04.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS'), 'K' from dual union all select 123, TO_DATE('05.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS'), 'K' from dual union all select 123, TO_DATE('06.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS'), NULL from dual union all select 123, TO_DATE('07.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS'), NULL from dual union all select 123, TO_DATE('08.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS'), 'K' from dual union all select 123, TO_DATE('09.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS'), '_' from dual union all select 123, TO_DATE('10.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS'), 'K' from dual union all select 123, TO_DATE('11.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS'), '_' from dual) -- -- query select emp_id, min(working_day) min_k, (select count(*)-1 from demo d where d.emp_id=emp_id and active_code='K' ) more_k from demo where active_code='K' group by emp_id;
WITH T AS ( SELECT D.*, DECODE(LAG(ACTIVE_CODE,1,ACTIVE_CODE) OVER (ORDER BY WORKING_DAY), ACTIVE_CODE,1,0) TST FROM DEMO D WHERE TRIM(TO_CHAR(WORKING_DAY,'DAY')) NOT IN ('SATURDAY','SUNDAY') ORDER BY WORKING_DAY ), T2 AS ( SELECT SUM(TST) OVER (PARTITION BY ACTIVE_CODE ORDER BY WORKING_DAY DESC)+1 TST2, T.* FROM T ORDER BY WORKING_DAY) SELECT * FROM T2 WHERE ACTIVE_CODE = 'K' AND TST = 0;
WITH got_grp_num AS ( SELECT emp_id , working_day , active_code , ROW_NUMBER () OVER ( PARTITION BY emp_id ORDER BY working_day ) - COUNT ( CASE WHEN active_code = 'K' THEN 1 END ) OVER ( PARTITION BY emp_id ORDER BY working_day ) AS grp_num FROM demo WHERE active_code IS NOT NULL -- AND ... -- Any filtering goes here ) SELECT emp_id , MIN (working_day) AS first_day , COUNT (*) AS cnt FROM got_grp_num WHERE active_code = 'K' GROUP BY emp_id , grp_num ORDER BY emp_id , first_day ;
-- Data: with demo as ( select 123 emp_id, TO_DATE('01.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS') working_day, '_' active_code from dual union all select 123, TO_DATE('02.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS'), '_' from dual union all select 123, TO_DATE('03.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS'), 'K' from dual union all select 123, TO_DATE('04.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS'), 'K' from dual union all select 123, TO_DATE('05.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS'), 'K' from dual union all select 123, TO_DATE('06.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS'), NULL from dual union all select 123, TO_DATE('07.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS'), NULL from dual union all select 123, TO_DATE('08.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS'), 'K' from dual union all select 123, TO_DATE('09.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS'), '_' from dual union all select 123, TO_DATE('10.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS'), 'K' from dual union all select 123, TO_DATE('11.11.2010 00:00:00','DD.MM.YYYY HH24:MI:SS'), '_' from dual) -- -- query: select emp_id, min(working_day) min_k, count(*) from demo where active_code='K' group by emp_id, to_char(working_day -1 ,'IW');
` EMP_ID FIRST_DAY CNT ---------- ------------------- ---------- 123 03.11.2010 00:00:00 4 123 10.11.2010 00:00:00 1
emp_id min_k count(*) ---------------------------------- 123 03.11.2010 4 123 10.11.2010 1
with demo(working_day,active_code) as( select TO_DATE('01.11.2010','DD.MM.YYYY'),'_' from dual union select TO_DATE('02.11.2010','DD.MM.YYYY'),'_' from dual union select TO_DATE('03.11.2010','DD.MM.YYYY'),'K' from dual union select TO_DATE('04.11.2010','DD.MM.YYYY'),'K' from dual union select TO_DATE('05.11.2010','DD.MM.YYYY'),'K' from dual union select TO_DATE('06.11.2010','DD.MM.YYYY'),NULL from dual union select TO_DATE('07.11.2010','DD.MM.YYYY'),NULL from dual union select TO_DATE('08.11.2010','DD.MM.YYYY'),'K' from dual union select TO_DATE('09.11.2010','DD.MM.YYYY'),'_' from dual union select TO_DATE('10.11.2010','DD.MM.YYYY'),'K' from dual union select TO_DATE('11.11.2010','DD.MM.YYYY'),'_' from dual) select min(working_day) as MIN_K,count(*) as MORE_K from (select working_day,active_code, Row_Number() over(order by working_day) -Row_Number() over(partition by active_code order by working_day) as gap from demo where active_code is not null) where active_code = 'K' group by gap order by min(working_day); MIN_K MORE_K -------- ------ 10-11-03 4 10-11-10 1