2016-12-12 6 views
2

Я ищу изменение нагрузки данных, которая выполняется с помощью внешнего инструмента для создания плоских файлов на основе нескольких соединений с использованием этого инструмента, а затем загружается в таблицу с помощью SQL * Loader.Поиск записей, которые существуют в одной таблице, но не в другой (соответствующей) таблице без первичного ключа

Я хотел бы отказаться от использования этой программы и использовать внешние таблицы, вместо этого перемещая вставку таблицы в базу данных. Я не уверен в справедливости моих объединений в сравнении с тем, что делала программа. Когда я сравниваю то, что я сделал с использованием внешних таблиц, у меня есть 14702052 общих записей и 14268891 отдельных записей. Когда я сравниваю таблицу со старым инструментом с теми же данными, у меня есть 14669198 записей, с 14268888 отличными. Меня не беспокоит общее число, так как дубликаты подходят для этого, это обновление некоторых значений, и дубликат не должен иметь значения.

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

Если бы было меньше записей, я мог бы сравнивать с помощью Kdiff3, но, поскольку он стоит, выход слишком большой, чтобы работать на моем компьютере. Я могу попытаться сломать его rownum как худшую попытку найти дополнительные записи.

У кого-нибудь есть предложения по альтернативе?

Edit: Вот структуру таблицы, пришлось вырезать некоторые из имен

CREATE TABLE T ( 
ID varchar2(11 byte), 
CLASS_CD varchar2(4 byte), 
ITEM_NAME varchar2(60 byte), 
UNIT_OF_ISSUE varchar2(2 byte), 
PRICE number(15,2), 
ITEM_CD varchar2(3 byte), 
SERVICE_CD varchar2(2 byte)); 

Вот пример записи, хотя я заменил большинство значений чувствительности.

ID   CLASS_CD ITEM_NAME  UOI  PRICE ITEM_CD SERVICE_CD 
000000057 1111  NAME  FT  5.91 NULL  BC 
+0

данные образца и желаемый результат – Teja

+0

Добавлена ​​структура таблицы и запись примера. Мне все равно, как выглядит вывод, просто пытаясь выяснить, что эти 3 дополнительные записи, которые появляются на мой счет. – wafflenator

ответ

3

Если у вас есть как новые, так и старые таблицы в той же структуре, это должно было дать вам по крайней мере 3 записей

select * from new_table 
minus 
select * from old_table 

В любом случае, используйте этот запрос, чтобы найти различия

select  count(case when tab='O' then 1 end) as cnt_old 
      ,count(case when tab='N' then 1 end) as cnt_new 

      ,id,class_cd,item_name,uoi,price,item_cd,service_cd 

from  (   select 'O' as tab,t.* from old_table t 
      union all select 'N'  ,t.* from new_table t 
      ) t 

group by id,class_cd,item_name,uoi,price,item_cd,service_cd 

having  count(case when tab='O' then 1 end) = 0 
     or count(case when tab='N' then 1 end) = 0 
; 
+0

Это оптимальное решение; по какой-то причине на SO это часто упускается из виду. – mathguy

+1

Мне нужно это сделать в будущем, спасибо! Все еще многому участвовал в этой роли. К сожалению, не работает, что, вероятно, означает, что что-то еще не так с моими данными. Kdiff3 с разделами может быть хорошей проверкой для меня. Я отмечу этот ответ, поскольку он действительно хочет делать то, что мне нужно! Наверное, минус я пропустил после того, как получил результаты, превышающие предполагаемую разницу, по какой-то причине в голове я думал, что раньше у меня было 0 результатов. – wafflenator

+0

Просто хотелось добавить, что это была проблема с данными, был возврат каретки, который возился с моим плоским файлом. Как только это было выяснено, оба вышеуказанных запроса сработали. – wafflenator

Смежные вопросы