powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вывод пропавших документов
16 сообщений из 16, страница 1 из 1
Вывод пропавших документов
    #32120750
Katya2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите советом!

Есть таблица документов.
Мне надо вывести те документы, которых нет в таблице.

Например ввели документы от 1 до 100, а 5-й и 22-й забыли
или с ним что-то случилось по дороге.

Мне хотелось бы написать Select выводящий эти номера.


Возможно ли это?
...
Рейтинг: 0 / 0
Вывод пропавших документов
    #32120754
Фотография MaxU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
version of Oracle?
...
Рейтинг: 0 / 0
Вывод пропавших документов
    #32120755
Katya2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oracle 8i
...
Рейтинг: 0 / 0
Вывод пропавших документов
    #32120758
Фотография MaxU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
8.1.5, 8.1.6, 8.1.7 ???

я спрашиваю потому что с версии 8.1.6 появились аналитические функции...
...
Рейтинг: 0 / 0
Вывод пропавших документов
    #32120759
Katya2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мы работаем с 8.1.7 , но можем впринципе перейти и на 9
...
Рейтинг: 0 / 0
Вывод пропавших документов
    #32120767
Фотография MaxU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
create table aaa (id number not null);

create unique index u_aaa$id on aaa(id);


insert into aaa values( 1 );
insert into aaa values( 8 );
insert into aaa values( 10 );
insert into aaa values( 11 );
insert into aaa values( 12 );
insert into aaa values( 15 );
commit;



 -- variant 1
 
select num from (
select rownum num from all_objects o1, all_objects o2 
where rownum < (select max(id) from aaa)
) n, aaa a
where n.num = a.id (+)
and a.id is null;


 -- variant 2
 
select num from (
select rownum num from all_objects o1, all_objects o2 
where rownum < (select max(id) from aaa)
) n
where not exists(select null from aaa where id=n.num);


ариант 1 в моем случае оказался немного дешевле/быстрее, у вас это будет зависит от характеристик таблицы с документами
...
Рейтинг: 0 / 0
Вывод пропавших документов
    #32120770
Katya2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ!

Но к сожалению такой вариант работал у меня бесконечно долго,
пришлось его убить не дождавшись результата.

Наверное из-за огромного количества документов.
Максимальный номер документа - 100 000 177.
...
Рейтинг: 0 / 0
Вывод пропавших документов
    #32120774
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если задача одноразовая, то ИМХО проще и быстрее вывести все id в файл и обработать, например, Перлом.

как вариант запроса с аналитической функцией можно предложить следуещее (правда, не уверен, что это быстрее чем у Макса :-):

Код: plaintext
1.
2.
3.
4.
5.
select prev_id +  1   "first not existing id in the frame" , 
        curr_id - prev_id -  1   "number of not existing id in the frame" 
from (select id curr_id, 
                LAG(id,  1 ,  0 ) OVER (ORDER BY id) as prev_id
        from aaa)
where curr_id - prev_id !=  1 
...
Рейтинг: 0 / 0
Вывод пропавших документов
    #32120780
Фотография Oracle X-pert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Declare
n number := 100 000 177;
begin
while(n > =0)
Loop
n := n - 1;
begin
Select 1 from my_doc
where doc_id = n;
exception
when NO_DATA_FOUND Then
dbms_output.put_line('Document No '||to_char(n));
end;
End Loop;
end;
...
Рейтинг: 0 / 0
Вывод пропавших документов
    #32120781
Фотография Oracle X-pert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Declare
n number := 100 000 177;
m number;
begin
while(n > =0)
Loop
n := n - 1;
begin
Select 1
Into m
from my_doc
where doc_id = n;
exception
when NO_DATA_FOUND Then
dbms_output.put_line('Document No '||to_char(n));
end;
End Loop;
end;
...
Рейтинг: 0 / 0
Вывод пропавших документов
    #32120783
Фотография MaxU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда я бы попробовал след. подход:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
create type numTable as table of number; 

create or replace function f
return numTable as
    l_doc_id_tbl	numTable	default numTable();
    l_seq_tbl		numTable	default numTable();
    l_miss_id_tbl	numTable	default numTable();
    l_cnt		number		default  0 ;
    l_max_id		number		default  0 ;
begin

    select id
    bulk collect
    into l_doc_id_tbl
    from aaa;

    select max(id) 
    into l_max_Id
    from aaa;

    l_seq_tbl.extend(l_max_id);

    for i in  1  .. l_max_id
    loop
        l_seq_tbl(i) := i;
    end loop;

    select num
    bulk collect into l_miss_id_tbl
    from (
    select column_value as num from TABLE ( cast(l_seq_tbl as numTable) )
    minus
    select column_value as num from TABLE ( cast(l_doc_id_tbl as numTable) )
    );

    l_seq_tbl.delete;
    l_doc_id_tbl.delete;

    return l_miss_id_tbl;

end;
/
show errors;

 -- show results
 
select * from TABLE(cast(f() as NumTable));
...
Рейтинг: 0 / 0
Вывод пропавших документов
    #32120785
Фотография MaxU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мда, тока памяти на коллекции может не хватить...

PS а вообще если эта задача разовая, то я бы вибрал вариант, кот. предложил .dba , то есть обрарботка перлом - дешево, быстро и сердито...
...
Рейтинг: 0 / 0
Вывод пропавших документов
    #32120789
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-- Макс у тебя была неплохая идея, но ее надо выполнят наоборот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create or replace type tb_numbers as table of number;
/
create or replace function all_numbers(p_start number, p_end number)
return tb_numbers is
  tb tb_numbers := tb_numbers();
  i pls_integer :=  0 ;
  j pls_integer :=  0 ;
begin
  for i in p_start..p_end loop
     tb.extend;
     j := j +  1 ;
     tb(j) := i;
  end loop;
  return tb;
end;
/

И далее select который выдает все номера недостающих доккументов:
Код: plaintext
1.
2.
3.
4.
5.
select t.column_value
from table(cast(all_numbers( 1 , 10000 ))) as tb_numbers)) t
where not exists (select null from doc_table d
                  where d.doc_id = t.column_value)
;

В данном случае на perl валится необязательно.
...
Рейтинг: 0 / 0
Вывод пропавших документов
    #32120790
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этот select можно сделать попроще:
Код: plaintext
1.
2.
3.
4.
select t.column_value from table(cast(all_numbers( 1 , 10000 ))) as tb_numbers)) t
minus
select d.doc_id from doc_table d
;
...
Рейтинг: 0 / 0
Вывод пропавших документов
    #32120793
Фотография MaxU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ShgGena,

согласен, мне так больше нравится, нo результатирующий "select" я бы по-другoму написал:

Код: plaintext
1.
2.
3.
4.
5.
 select t.column_value
from table(cast(all_numbers( 1 , 10000 ))) as tb_numbers)) t
minus
select doc_id from doc_table
;


в споре рождается истина
...
Рейтинг: 0 / 0
Вывод пропавших документов
    #32120794
Фотография MaxU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHAYTAN!!!

poka ya cifiricey svoy otvet perevodil... ti TAKOY ZHE SQL privel
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вывод пропавших документов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]