【问题标题】:Alternate method for replacing Minus,Union All,Intersect operators in Oracle在 Oracle 中替换 Minus、Union All、Intersect 运算符的替代方法
【发布时间】:2018-07-20 00:20:54
【问题描述】:

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

我的疑问: 我可以用减号运算符以外的方式更改过程的逻辑吗? 有什么建议吗?

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;

【问题讨论】:

  • 如果集合算子有效,为什么要改变它?
  • 它是什么样子的。
  • @tbone 是的,集合运算符绝对有效,我只是想尝试一些可以更好地提高性能的先进方法
  • 在大多数情况下,您很难胜过集合运算符。但是贴出代码,让我们看看
  • @tbone 我给出了代码的骨架,因为它是特定于项目的。

标签: oracle plsql union-all nested-queries


【解决方案1】:

计算仅出现在 2 个表之一中的行数。 如果 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。

【讨论】:

  • 使用上面的查询会有性能问题吗?
【解决方案2】:

计算两个表中的行数并使用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 给你的,请在那里阅读答案。但是你需要对数据进行分组和计数,所以这会比你现在做的还要慢。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2021-11-13
    相关资源
    最近更新 更多