Oracle SQL Join查询结果

时间:2016-10-04 18:49:49

标签: sql oracle

我有以下两个表

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

我们有一个运行的进程从源表获取数据并加载到目标表中。但是在这里,该过程有一条规则,说Target中的主要行应该具有源表中的Source Name,其中Source ID ='Monster'。 这里Target中的以下条目是正确的

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

但以下是错误的,主要来源名称是Dice.com,应该是ABC COMPANY。

{{1}}

所以我需要一个查询,它可以识别Target中所有相同问题的行。

1 个答案:

答案 0 :(得分:1)

为什么AI_CL_ID = 111的两行是正确的?根据您的说明,它们是错误的,因为记录= 123对应于“怪物”#39;但它有'中学'在target_system表中。

要使用错误的target_system查找op_code表中的所有行,您可以使用以下查询。假设:对(id,code)是唯一的target_system;任何列中都没有NULL; source_name中的target_system始终是正确的(当source_namesource_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