Oracle SQL-更新列数据的使用减算

0

的问题

我这sql query

(select x.a, x.b, x.c, x.d
from tableX x
where x.a IS NOT NULL
minus 
select y.a, y.b, y.c, y.d
from tableY y);

上述查询返回我所有tableX数据,这是不同tableY. 多元组返回

证据:

当我跑上查询我得到这个结果:

一个 b c
1 43 65
2 66 333

当我选择的数据tableY我得到这个:

一个 b c
1 54 65
2 88 567

tableY的数据是正确的数据,所以,我要更新所有组返回,从第一个查询(一个与减条款)的数据tableY.

预期的结果,更新后的条款,当我选择的数据tableX应该是:

一个 b c
1 54 65
2 88 567

什么是最eficcient的方式做到这一新条款?

oracle plsql sql
2021-11-23 19:18:31
2

最好的答案

1

在oracle我找到合并的语法更加可用于更新法...

MERGE INTO
  tablex   x
USING
  tabley   y
    ON (y.a = x.a)
WHEN MATCHED THEN UPDATE
  SET
    x.b = y.b,
    x.c = y.c
  WHERE
    LNNVL(x.b = y.b)
    OR
    LNNVL(x.c = y.c)

编辑:加入那里的条款,以避免的冗余的更新,以下评论如下。

2021-11-23 20:50:15

是行x。b=y。b和x.c=y。c包括在交易?
jarlh

@jarlh加入一个条款来的 WHEN MATCHED 为了避免这种情况。
MatBailie

这个解决方案解决我的问题了,谢谢你
jct
0
update tablex
set (b, c) = (select b, c from tabley where tabley.a = tablex.a)
where exists (select 1 from tabley where tabley.a = tablex.a);

保持交易规模下降,增加预算外<>yb或xc<>yc:

update tablex
set (b, c) = (select b, c from tabley where tabley.a = tablex.a)
where exists (select 1 from tabley
              where tabley.a = tablex.a
                and (LNNVL(tabley.b = tablex.b) or LNNVL(tabley.c = tablex.c)));
2021-11-23 20:39:46

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................