在Oracle中替换Minus,Union All,Intersect运算符的替代方法

时间:2018-07-19 14:10:40

标签: oracle plsql union-all nested-queries

我必须比较两个表中的数据。当前有一个存储过程,过程逻辑如下: 选择第一个表数据减去第二个表数据,反之亦然。如果计数匹配,则仅将消息硬编码为“匹配”,否则为“不匹配”

我的疑问: 除负号运算符外,是否可以更改过程的逻辑? 有什么建议吗?

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;

2 个答案:

答案 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给您,请在此处阅读答案。但是您需要对数据进行分组和计数,因此这将比您现在做的还要慢。

如果没有出现重复的行,那么彼得的答案看起来很有希望。