CftClub.ru
Клуб специалистов ЦФТ-Банк

Сравнение таблиц
На страницу Пред.  1, 2
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
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    Ответить с цитатой
Полезность: Нет оценки
коллега-программер говорит, что ваш вариант самый лучший) попробую его как-нибудь применить)
хотя моих знаний едва хватает чтобы прочитать ваше произведение Smile

спасибо!
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
На страницу Пред.  1, 2
Страница 2 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru