2016-10-04 4 views
-2

У меня есть следующие две таблицыOracle SQL Регистрация Результаты запроса

Table 1: SOURCE_SYSTEM 
ID CODE Source ID Source Name 
123 111 Monster Dice.com 
456 111 Dice ABC COMPANY 
456 888 Ticv A2 systems 
4566 999 MOnster hgtt solutions 
789 222 Monster ABC COMPANY 
985 222 Dice Dice.com 

Table 2: TARGET_SYSTEM 
RECORDID AI CL ID Source Name Op Code 
123 111 Dice.com Secondary 
456 111 ABC COMPANY Primary 
789 222 ABC COMPANY Secondary 
985 222 Dice.com Primary 

У нас есть процесс, который проходит получает данные из исходной таблицы и загружает в целевой таблице. Но здесь у процесса есть правило, указывающее, что первичная строка в Target должна иметь исходное имя из исходной таблицы, где Source ID = 'Monster'. Здесь следующая запись в Target правильно

RECORDID AI CL ID Source Name Op Code 
123 111 Dice.com Secondary 
456 111 ABC COMPANY Primary 

Но следующий неправильно, имеет имя первоисточник Dice.com, который должен быть ABC COMPANY.

RECORDID AI CL ID Source Name Op Code 
789 222 ABC COMPANY Secondary 
985 222 Dice.com Primary 

Так что мне нужен запрос, который может идентифицировать все строки в Target, которые имеют ту же проблему.

+1

Ваш вопрос не ясен для меня, и я боюсь, что другие читатели могут думать одинаково. Постарайтесь лучше объяснить, чего вы пытаетесь достичь. – Elyasin

ответ

1

Почему две строки для AI_CL_ID = 111 правильные? Они ошибочны согласно вашей спецификации, потому что записанный = 123 соответствует «Monster», но он имеет «Вторичный» в вашей таблице target_system.

Чтобы найти все строки в таблице target_system с неверными op_code, вы можете воспользоваться следующим запросом. Предположения: пара (id, code) уникальна target_system; в любом столбце нет NULL; source_name в target_system всегда правилен (он соответствует source_name в source_system при согласовании id и code); маркер 'Primary' является особенным, но могут быть и другие маркеры, кроме 'Secondary'.

Решение не включает строки от «до» до «закрытия») после определения target_system; предложение WITH используется для генерации тестовых данных в самом запросе, но в реальной жизни вы должны просто начать с select t.id, ... и ударить по базовым таблицам или представлениям.

with 
    source_system (id, code, source_id, source_name) as (
     select 123, 111, 'Monster', 'Dice.com'  from dual union all 
     select 456, 111, 'Dice' , 'ABC COMPANY' from dual union all 
     select 456, 888, 'Ticv' , 'A2 systems'  from dual union all 
     select 4566, 999, 'MOnster', 'hgtt solutions' from dual union all 
     select 789, 222, 'Monster', 'ABC COMPANY' from dual union all 
     select 985, 222, 'Dice' , 'Dice.com'  from dual 
    ), 
    target_system (recordid, ai_cl_id, source_name, op_code) AS (
     select 123, 111, 'Dice.com' , 'Secondary' from dual union all 
     select 456, 111, 'ABC COMPANY', 'Primary' from dual union all 
     select 789, 222, 'ABC COMPANY', 'Secondary' from dual union all 
     select 985, 222, 'Dice.com' , 'Primary' from dual 
    ) 
select t.recordid, t.ai_cl_id, t.source_name, t.op_code 
from target_system t inner join source_system s 
         on t.recordid = s.id and t.ai_cl_id = s.code 
where (s.source_id = 'Monster' and t.op_code != 'Primary') 
     or 
     (s.source_id != 'Monster' and t.op_code = 'Primary') 
order by ai_cl_id, recordid 
; 

Выход (с входами, выход отличается от того, в вашем посте, так что у вас есть в вашем посте не так, как я объяснил).

RECORDID AI_CL_ID SOURCE_NAME OP_CODE 
---------- ---------- ----------- --------- 
     123  111 Dice.com Secondary 
     456  111 ABC COMPANY Primary 
     789  222 ABC COMPANY Secondary 
     985  222 Dice.com Primary 
Смежные вопросы