| 
 
  
	| Сравнение таблиц На страницу 1, 2  След.
 
 |  
	
		| Предыдущая тема :: Следующая тема |  
		| Автор | Сообщение |  
		| 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    |   |  
				| Полезность: Нет оценки 
 |  
				| блин, ну прошу прощения  думал будет понятно) давайте решать проблему конструктивно) |  |  
		|  |  
		| 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 - пример временной таблицы.
 | 
 
 пусть даже так, я упомянул вначале, что не программист, а всего лишь любитель. Честно скажу, что я и четверти документации по словарю данных не прочел еще
   Суть Вы поняли, меня ответ интересует, а не то, как это называется.
 
 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 работает
   
 Ну или два вложенных цикла по каждому из массивов.. Получишь аналог NESTED_LOOPS
   
 
  	  | Цитата: |  	  | тут на сайте был пример как можно сделать select к вложенным таблицам.. 
 | 
 ЦээФТа при декларировании Nested Table добавляем "index by" в теле пакета. Поэтому напрямую подставить такое в SELECT через table() не получится.
 
 Последний раз редактировалось: maestro (Вт Фев 19, 2013 12:04), всего редактировалось 1 раз
 |  |  
		|  |  
		| vtar Эксперт
 
 
 Вступление в Клуб: 20.03.2009
 
 | 
			
				|  Вт Фев 19, 2013 11:59    |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | wolfio пишет: |  	  | я упомянул вначале, что не программист, а всего лишь любитель. | 
 
 Выражаю опасения, как бы инициатору не снесло крышу от hsh ...
   
  	  | maestro пишет: |  	  | Сделай третью таблицу, индексированную по hash из конкатенации полей таблицы | 
 |  |  
		|  |  
		| maestro Профи
 
 
 Вступление в Клуб: 12.10.2010
 
 | 
			
				|  Вт Фев 19, 2013 12:07    |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | vtar пишет: |  	  | Выражаю опасения, как бы инициатору не снесло крышу от hsh ...
   
 | 
 
 Наберите в Яндексе Hash и посмотрите на картинке в самом верху страницы
   http://yandex.ru/yandsearch?text=hash&lr=213
 Снеси крышу может
  |  |  
		|  |  
		| 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 работает
   
 Ну или два вложенных цикла по каждому из массивов.. Получишь аналог NESTED_LOOPS
   
 
  	  | Цитата: |  	  | тут на сайте был пример как можно сделать 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
 |  |  
		|  |  
		|  |  
  
	| 
 
 | Вы не можете начинать темы Вы не можете отвечать на сообщения
 Вы не можете редактировать свои сообщения
 Вы не можете удалять свои сообщения
 Вы не можете голосовать в опросах
 
 |  |