我有以下两个表
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中所有相同问题的行。
答案 0 :(得分:1)
为什么AI_CL_ID = 111的两行是正确的?根据您的说明,它们是错误的,因为记录= 123对应于“怪物”#39;但它有'中学'在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