2016-10-04 2 views
-2

Ergebnisse habe ich die folgenden zwei TabellenOracle SQL Join-Abfrage

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 

Wir haben einen Prozess, der die Daten aus der Quellentabelle und lädt in Zieltabelle läuft bekommt. Aber hier hat der Prozess eine Regel, die besagt, dass die primäre Zeile in Target die Source Name from Source Tabelle haben sollte, wo Source ID = 'Monster'. Hier wird der folgende Eintrag in Target korrekt ist

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

Aber die folgende falsch ist, hat die primäre Quelle Name ist Dice.com die ABC COMPANY sein sollte.

Also brauche ich eine Abfrage, die alle Zeilen in Target, die das gleiche Problem identifizieren können.

+1

Ihre Frage ist mir nicht klar und ich fürchte, andere Leser könnten genauso denken. Bitte versuchen Sie besser zu erklären, was Sie erreichen möchten. – Elyasin

Antwort

1

Warum sind die zwei Zeilen für AI_CL_ID = 111 korrekt? Sie sind falsch gemäß Ihrer Spezifikation, denn aufgezeichnet = 123 entspricht "Monster" aber es hat "Sekundär" in Ihrer target_system Tabelle.

Um alle Zeilen in der target_system Tabelle mit dem falschen op_code zu finden, können Sie die folgende Abfrage verwenden. Annahmen: Das Paar (ID, Code) ist einzigartig target_system; In keiner Spalte sind NULL-Werte enthalten. source_name in target_system ist immer korrekt (es entspricht der source_name in source_system, wenn durch id und code übereinstimmen); Der Marker 'Primary' ist speziell, aber neben 'Secondary' kann es noch andere Marker geben.

Die Lösung enthält nicht die Zeilen von "mit" bis zum Abschluss ")" nach der Definition von target_system; Die WITH-Klausel wird verwendet, um Testdaten innerhalb der Abfrage selbst zu generieren, aber im wirklichen Leben sollten Sie einfach mit select t.id, ... beginnen und Ihre Basistabellen oder Ansichten treffen.

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 
; 

Ausgang (mit Eingängen, die Ausgabe unterscheidet sich von dem in Ihrem Beitrag, da, was Sie in Ihrem Beitrag haben, ist falsch, wie ich erklärt).

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