我必须比较两个表中的数据。当前有一个存储过程,过程逻辑如下: 选择第一个表数据减去第二个表数据,反之亦然。如果计数匹配,则仅将消息硬编码为“匹配”,否则为“不匹配”
我的疑问: 除负号运算符外,是否可以更改过程的逻辑? 有什么建议吗?
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;
答案 0 :(得分:0)
统计仅出现在两个表之一中的行。 如果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。
答案 1 :(得分:0)
对两个表中的行计数并使用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行,这没有告诉我们。 Here is similiar question给您,请在此处阅读答案。但是您需要对数据进行分组和计数,因此这将比您现在做的还要慢。
如果没有出现重复的行,那么彼得的答案看起来很有希望。