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

Сравнение таблиц
На страницу 1, 2  След.
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
wolfio
Участник - экстремал


Вступление в Клуб: 22.10.2012
СообщениеВт Фев 19, 2013 06:55   Сравнение таблиц Ответить с цитатой
Полезность: Нет оценки
Доброго времени суток, товарищи.
Я не программер, но в целях саморазвития пишу операции, когда работа позволяет отвлечься.
Сейчас дошел до момента, где мне нужно сравнить 2 таблицы.
И так условия:

есть временная таблица, созданная в процессе работы операции, назовем ее таблица А.
Данные в ней такие:
1
2
3
4
5

Есть массив, который походит на таблицу в моем случае, назовем ее Б.
Данные:

1
3
4
5
---

Вопрос: как сделать проверку (через FOR), на данные таблицы А, которых нет в таблице Б?
В результате, в отладку я должен вывести, строку таблицы А, которой нет в Б.

Может и не через For, просто не знаю как по-другому. Подскажите, пожалуйста.
yaffil
Профи


Вступление в Клуб: 18.08.2011
СообщениеВт Фев 19, 2013 08:01    Ответить с цитатой
Полезность: Нет оценки
Как то вот так. В лупе делаете чего угодно с данными записями.

Код:
for (select ee (trunc(ee.[DATE]) :A1
                     ,vid_oper(ee.[OPER]) :B1
                     ,nvl(ee.[SUMMA],0) :C1
                     ,to_char(kredit%id) : D1
                     ) in kredit.[LIST_PLAN_PAY]
                     where  ee.[CHANGE]=1
                     and vid_oper(ee.[OPER]) in (1,2,3)
                     and ee.[OPER].            
minus
             select ee2 (trunc(ee2.[CHART_DATE]) :A2
                      ,ee3.[TYPE1] :B2
                      ,nvl(ee3.[SUM1],0) :C2
                      ,ee2.[CREDIT_ID] : D2
                      ) in ::[STR_CHART], (::[STR_CHART_SUM] :ee3)
                     where ee2.[CHART_ID]=ee3.[CHART_ID]
                        and ee3.[TYPE1] in (1,2,3)
                        and ee2.[CREDIT_ID]=kredit
                        
            ) loop
            
debug_pipe(' ee  '||A1||B1||C1||D1,0);
         
      
      end loop;
wolfio
Участник - экстремал


Вступление в Клуб: 22.10.2012
СообщениеВт Фев 19, 2013 08:29    Ответить с цитатой
Полезность: Нет оценки
yaffil, боюсь, что ваш метод мне не подходит, т.к. я сказал сразу - таблица А - это объявленная таблица. Я не могу сделать по ней селект.
yaffil
Профи


Вступление в Клуб: 18.08.2011
СообщениеВт Фев 19, 2013 08:36    Ответить с цитатой
Полезность: Нет оценки
wolfio пишет:
yaffil, боюсь, что ваш метод мне не подходит, т.к. я сказал сразу - таблица А - это объявленная таблица. Я не могу сделать по ней селект.


Читаем внимательно

wolfio пишет:

Сейчас дошел до момента, где мне нужно сравнить 2 таблицы.

есть временная таблица, созданная в процессе работы операции, назовем ее таблица А

Вопрос: как сделать проверку (через FOR), на данные таблицы А, которых нет в таблице Б?


Ни слова ни про какие объявленные таблицы!
wolfio
Участник - экстремал


Вступление в Клуб: 22.10.2012
СообщениеВт Фев 19, 2013 08:40    Ответить с цитатой
Полезность: Нет оценки
блин, ну прошу прощения Smile думал будет понятно) давайте решать проблему конструктивно)
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеВт Фев 19, 2013 09:02    Ответить с цитатой
Полезность: Нет оценки
объявленная таблица - table of ?

В таком случае, завести временную таблицу - ТБП с временем жизни до окончания сессии и нужными полями, вставить нужные значения в ТБП - можно select сделать.
wolfio
Участник - экстремал


Вступление в Клуб: 22.10.2012
СообщениеВт Фев 19, 2013 09:06    Ответить с цитатой
Полезность: Нет оценки
vtar пишет:
объявленная таблица - table of ?

В таком случае, завести временную таблицу - ТБП с временем жизни до окончания сессии и нужными полями, вставить нужные значения в ТБП - можно select сделать.


блииин.. она так и сделана:

Код:
type STRUCTURE is record (vid_tune ref [KIND_TUNINGS]
                    ,cod_tun varchar2
                    ,cod_gr varchar2
                    ); --создаем структуру с указанными полями
type table_of_STRUCTURE is table of STRUCTURE; --создаем таблицу на основе структуры
tmptbl table_of_STRUCTURE;    --алиас для созданной таблицы


Это у меня таблица А.
Таблицей Б у меня выступает массив, по которому я бегаю через for
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеВт Фев 19, 2013 09:15    Ответить с цитатой
Полезность: Нет оценки
wolfio пишет:
она так и сделана:

не так. Нет у Вас таблицы, есть объект в памяти. Посмотрите в словаре ТБП KLADR_IMPORT - пример временной таблицы.
wolfio
Участник - экстремал


Вступление в Клуб: 22.10.2012
СообщениеВт Фев 19, 2013 09:26    Ответить с цитатой
Полезность: Нет оценки
vtar пишет:
wolfio пишет:
она так и сделана:

не так. Нет у Вас таблицы, есть объект в памяти. Посмотрите в словаре ТБП KLADR_IMPORT - пример временной таблицы.


пусть даже так, я упомянул вначале, что не программист, а всего лишь любитель. Честно скажу, что я и четверти документации по словарю данных не прочел еще Sad
Суть Вы поняли, меня ответ интересует, а не то, как это называется.

KLADR_IMPORT - посмотрел. Пропадет в конце чьей сессии?
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеВт Фев 19, 2013 11:02    Ответить с цитатой
Полезность: Нет оценки
Для вложенной таблицы либо пользовать CAST, либо как тут на сайте был пример как можно сделать select к вложенным таблицам...
maestro
Профи


Вступление в Клуб: 12.10.2010
СообщениеВт Фев 19, 2013 11:53    Ответить с цитатой
Полезность: Нет оценки
Сделай третью таблицу, индексированную по hash из конкатенации полей таблицы 2. При обходе table1 проверяй
table3.exists(utils.hash(...))

Заодно поймешь как HASH_JOIN работает Smile

Ну или два вложенных цикла по каждому из массивов.. Получишь аналог NESTED_LOOPS Smile

Цитата:
тут на сайте был пример как можно сделать select к вложенным таблицам..

ЦээФТа при декларировании Nested Table добавляем "index by" в теле пакета. Поэтому напрямую подставить такое в SELECT через table() не получится.


Последний раз редактировалось: maestro (Вт Фев 19, 2013 12:04), всего редактировалось 1 раз
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеВт Фев 19, 2013 11:59    Ответить с цитатой
Полезность: Нет оценки
wolfio пишет:
я упомянул вначале, что не программист, а всего лишь любитель.


Выражаю опасения, как бы инициатору не снесло крышу от hsh ... Smile
maestro пишет:
Сделай третью таблицу, индексированную по hash из конкатенации полей таблицы
maestro
Профи


Вступление в Клуб: 12.10.2010
СообщениеВт Фев 19, 2013 12:07    Ответить с цитатой
Полезность: Нет оценки
vtar пишет:

Выражаю опасения, как бы инициатору не снесло крышу от hsh ... Smile


Наберите в Яндексе Hash и посмотрите на картинке в самом верху страницы Smile
http://yandex.ru/yandsearch?text=hash&lr=213
Снеси крышу может Smile
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеВт Фев 19, 2013 15:02    Ответить с цитатой
Полезность: Нет оценки
Может проще?

Бежать циклом по таблице А, искать в таблице B. (если не миллионы строк)
wolfio
Участник - экстремал


Вступление в Клуб: 22.10.2012
СообщениеСр Фев 20, 2013 01:21    Ответить с цитатой
Полезность: Нет оценки
maestro пишет:
Сделай третью таблицу, индексированную по hash из конкатенации полей таблицы 2. При обходе table1 проверяй
table3.exists(utils.hash(...))

Заодно поймешь как HASH_JOIN работает Smile

Ну или два вложенных цикла по каждому из массивов.. Получишь аналог NESTED_LOOPS Smile

Цитата:
тут на сайте был пример как можно сделать select к вложенным таблицам..

ЦээФТа при декларировании Nested Table добавляем "index by" в теле пакета. Поэтому напрямую подставить такое в SELECT через table() не получится.


прошу прощения конечно, но vtar прав, я не программист. про hash я ничего не знаю. если есть возможность найти и показать простой пример из дистрибутива, то очень прошу. РБО 12.5.

Volod, пробовал бегать циклом по таблице А, и искать в Б, но он не бегает по той записи А, которой нет в Б. Может написал не правильно. логика схематично была такой:

for x in b
loop
if x.val = a.val
then ok
else err
end if
end loop
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
На страницу 1, 2  След.
Страница 1 из 2

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