Сравнение таблиц
На страницу Пред. 1, 2
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Alkov Профи
Вступление в Клуб: 23.09.2010
|
Ср Фев 20, 2013 03:23   |
|
Полезность: Нет оценки
|
for a in A
rez=false
for x in b
loop
if x.val = a.val
then
rez=true
exit
end if
end loop
if rez
ok
else
err
end if
end loop |
|
 |
wolfio Участник - экстремал
Вступление в Клуб: 22.10.2012
|
Ср Фев 20, 2013 03:41   |
|
Полезность: Нет оценки
|
Пробовал так, вот мой вариант:
[code]
for z in ::[VAL_TUNING] all
WHERE z%COLLECTION = X.[TUNINGS]
and (z.[DELETED] = 0 or z.[DELETED] is null)
and z.[DATE_END] >= p_date
LOOP
bol := false;
for j in 1..tmptbl.count
loop
if tmptbl(j).vid_tune = nvl(z.[KIND_TUNE_REF],0)
and tmptbl(j).cod_tun = nvl(z.[KIND_TUNE_REF].[NAME],'no') then
null;
bol := true;
exit;
else
bol := false;
end if;
end loop;
if bol then debug_pipe(X.[CODE] ||z.[KIND_TUNE_REF].[NAME]||'...Ok' ,0); --nash
else debug_pipe(X.[code]||z.[KIND_TUNE_REF].[NAME]||'...check Error' ,0); --net
end if;
--bool
END LOOP;
[/code]
,tmptbl - это таблица А,
z - это таблица Б.
Проблмема в том, что при таком условии он не берет запись из А, которой нет в Б, потому что при сравнении (=) не находит ей соответствия, а селект к экзистом я сделать не могу. |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Ср Фев 20, 2013 07:15   |
|
Полезность: 1
|
wolfio пишет: | Пробовал так, вот мой вариант:
|
Ну ей-богу, я глаза сломал!
Код: |
declare
type STRUCTURE is record (
vid_tune ref [KIND_TUNINGS]
, cod_tun varchar2
, cod_gr varchar2
); --создаем структуру с указанными полями
type table_of_STRUCTURE is table of STRUCTURE index by binary_integer; --создаем таблицу на основе структуры
A table_of_STRUCTURE;
B table_of_STRUCTURE;
-- Всё-таки это не таблицы, а массивы, или списки
type map_str is table of varchar2(32767) index by varchar2(32767);
M map_str;
-- А эта переменная - множество
vIdx varchar2(32767);
begin
--... Инициализация данных массивов A и B
--... Индексируем массив B
M.delete;
for i in 1 .. B.count loop
vIdx := B(i).vid_tune || '#' || B(i).cod_tun || '#' || B(i).cod_gr;
if M.exists(vIdx) then
M(vIdx) := M(vIdx) || ',' || i;
else
M(vIdx) := i;
end if;
end loop;
-- Теперь в цикле по массиву A проверяем, есть ли такие же записи в таблице B:
for i in 1 .. A.count loop
vIdx := A(i).vid_tune || '#' || A(i).cod_tun || '#' || A(i).cod_gr;
if M.exists(vIdx) then
dbms_output.put_line('Для значения массива A с индексом '||i||' найдено соответствие в таблице B с индексами '||M(vIdx));
else
dbms_output.put_line(i||' - ничего не нашлось');
end if;
end loop;
end;
|
|
|
 |
wolfio Участник - экстремал
Вступление в Клуб: 22.10.2012
|
Ср Фев 20, 2013 08:07   |
|
Полезность: Нет оценки
|
коллега-программер говорит, что ваш вариант самый лучший) попробую его как-нибудь применить)
хотя моих знаний едва хватает чтобы прочитать ваше произведение
спасибо! |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|