Еще немного иерархии или как найти номер отсутствующей записи в последовательно пронумерованных записях таблицы . CONNECT BY

dbstalker, 28 июля

Ознакомьтесь с постом и постом, а затем продолжим. Как в запросе сгенерировать последовательность от 1 до 100? Да очень просто:

SELECT ROWNUM  FROM DUAL CONNECT BY level<=100

Надеюсь тут все понятно? А теперь пойдем дальше. Предположим у вас есть таблица с пронумерованными записями. Но какой-то умник удалил несколько записей. Нужно узнать записи, с какими номерами были удалены.

Сначала найдем максимальный номер в нашей таблице


SELECT max(id) FROM my_table;

Теперь сформируем последовательность, используя конструкцию CONNECT BY:

SELECT ROWNUM  FROM DUAL CONNECT BY level<=( SELECT max(id) FROM my_table);

Отмечу, что CONNECT BY работает с подзапросами только с 10 версии ORACLE.

А дальше вы уже и сами поняли, как нужно действовать. Ну, например, вот так:

SELECT id_pr FROM my_table a,(SELECT ROWNUM as id_pr  FROM DUAL CONNECT BY level<=( SELECT max(id) FROM my_table)) b
 where id(+)=id_pr and id is null

Ну вот и все.

2 комментария

Прокоментировать

Ora78
20 сентября 2012 г. в 09:42

так оптимальнее
SQL> with my_table as
2 (
3 select 1 rnum from dual union all
4 select 2 rnum from dual union all
5 select 5 rnum from dual union all
6 select 6 rnum from dual union all
7 select 8 rnum from dual union all
8 select 9 rnum from dual union all
9 select 10 rnum from dual
10 )
11 select rnum
12   from (select level rnum
13         from dual
14       connect by level <= (select max(rnum) from my_table)) t
15   where t.rnum not in (select rnum from my_table);

    RNUM
----------
      3
      4
      7

Ora78
20 сентября 2012 г. в 12:07

нет. ваш вариант быстрее

 

Новый комментарий

Я не спамер: введите суму 6+2



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум

Последние темы:

Расписание автобусов
18 июля, 3 ответа
Отдых в августе
17 июля, 4 ответа