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

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

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

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


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

я спрашиваю потому что с версии 8.1.6 появились аналитические функции...
...
Рейтинг: 0 / 0
16.03.2003, 14:50
    #32120759
Katya2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод пропавших документов
Мы работаем с 8.1.7 , но можем впринципе перейти и на 9
...
Рейтинг: 0 / 0
16.03.2003, 15:43
    #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
16.03.2003, 16:32
    #32120770
Katya2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод пропавших документов
Спасибо за ответ!

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

Наверное из-за огромного количества документов.
Максимальный номер документа - 100 000 177.
...
Рейтинг: 0 / 0
16.03.2003, 17:20
    #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
16.03.2003, 18:25
    #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
16.03.2003, 18:26
    #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
16.03.2003, 18:29
    #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
16.03.2003, 18:40
    #32120785
MaxU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод пропавших документов
мда, тока памяти на коллекции может не хватить...

PS а вообще если эта задача разовая, то я бы вибрал вариант, кот. предложил .dba , то есть обрарботка перлом - дешево, быстро и сердито...
...
Рейтинг: 0 / 0
16.03.2003, 19:12
    #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
16.03.2003, 19:18
    #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
16.03.2003, 19:21
    #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
16.03.2003, 19:22
    #32120794
MaxU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод пропавших документов
SHAYTAN!!!

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


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