Альтернативный метод замены операторов Minus, Union All, Intersect в Oracle

Мне нужно сравнить данные из двух таблиц. В настоящее время существует хранимая процедура, в которой логика процедуры заключается в выборе данных 1-й таблицы за вычетом данных 2-й таблицы и наоборот. Бесподобный"

Мои сомнения: могу ли я изменить логику процедуры с помощью операторов, отличных от минуса? какие-либо предложения?

select count(*) into t1 from c1;
select count(*) into t2 from c2;
select count(*) into t3 from(
   select a1,a2,a3 from c1
      minus
     select a1,a2,a3 from c2);
select count(*) into t4 from(
     select a1,a2,a3 from c2
      minus
     select a1,a2,a3 from c1);

select count(*) into t5 from(
     select a1,a2,a3 from c2
      Intersect
     select a1,a2,a3 from c1);

Insert into A1 
SELECT t1,t2,t3,t4,t5,(CASE WHEN T4=0 THEN ‘MATCHED’
                                        ELSE ‘NOT MTACHED’
                                         END) STATUS ,’ ‘
FROM DUAL;

person Arun    schedule 19.07.2018    source источник
comment
Если операторы набора работают, зачем вы хотите их изменить?   -  person tbone    schedule 19.07.2018
comment
На что это похоже.   -  person Jimenemex    schedule 19.07.2018
comment
@tbone да, операторы наборов абсолютно работают, я просто хочу попробовать какой-нибудь продвинутый метод, который может значительно повысить производительность.   -  person Arun    schedule 19.07.2018
comment
В большинстве ситуаций вам будет трудно превзойти операторы множеств. Но выложи код, посмотрим   -  person tbone    schedule 19.07.2018
comment
@tbone Я даю скелет кода, поскольку он специфичен для проекта.   -  person Arun    schedule 19.07.2018
comment
выберите count() в t1 из c1; выберите count() в t2 из c2; выберите count() в t3 из (выберите a1,a2,a3 из c1 минус выберите a1,a2,a3 из c2); выберите count() в t4 из (выберите a1,a2,a3 из c2 минус выберите a1,a2,a3 из c1); выберите count(*) в t5 from( выберите a1,a2,a3 из c2 Intersect выберите a1,a2,a3 из c1); Вставьте в A1 ВЫБЕРИТЕ t1,t2,t3,t4,t5, (СЛУЧАЙ, КОГДА T4=0, ТО «СООТВЕТСТВУЕТ», ИНАЧЕ «НЕ СООТВЕТСТВУЕТ» КОНЕЦ) СТАТУС, '' ОТ ДВОЙНОГО;   -  person Arun    schedule 19.07.2018


Ответы (2)


Подсчитайте строки, которые встречаются только в одной из двух таблиц. Если count равен 0, у вас есть совпадение.

SELECT decode(count (*), 0, 'MATCH', 'NO MATCH')
FROM T_1
FULL OUTER JOIN T_2
    ON T_1.a = T_2.a AND T_1.b = T_2.b /* List all colums */
WHERE T_1.a IS NULL
   OR T_2.a IS NULL;

T_1.a и T_2.a являются ключами и НЕ NULL.

person Based    schedule 19.07.2018
comment
будут ли какие-либо проблемы с производительностью при использовании вышеуказанного запроса? - person Arun; 19.07.2018

Подсчет строк из обеих таблиц и использование minus дважды кажется достаточным, я не представлял себе сценарий, в котором intersect находит что-то новое. Однако существует ситуация, когда таблицы разные, а ваши запросы показывают MATCHED:

with 
  t1(a1, a2, a3) as (
    select 1, 1, 1 from dual union all
    select 1, 1, 1 from dual union all
    select 2, 2, 2 from dual  ),
  t2(a1, a2, a3) as (
    select 1, 1, 1 from dual union all
    select 2, 2, 2 from dual union all
    select 2, 2, 2 from dual  )
select a1, a2, a3 from t1 intersect select a1, a2, a3 from t2 

Оба minus показывают пустой результат, количество строк одинаковое, пересечение показывает 2 строки, и это ничего нам не говорит. Вот аналогичный вопрос к вашему, пожалуйста, прочитайте ответы там. Но вам нужно сгруппировать и подсчитать данные, так что это будет еще медленнее, чем то, что вы делаете сейчас.

Если повторяющиеся строки не проблема, то ответ Питера выглядит многообещающе.

person Ponder Stibbons    schedule 19.07.2018