回答

收藏

如何在Oracle中使用内部联接进行更新

技术问答 技术问答 77 人阅读 | 0 人回复 | 2023-09-13

有人可以验证内部连接对PL SQL中的UPDATE语句是否有效吗?例如  ^- y* y% c4 O' `2 r" Q
Update table t
& Y( e4 b, [$ S: W1 Mset t.value='value'
4 g2 V/ h$ u& Z" ifrom tableb b inner join' x( A; x" {* g$ i- K' y4 A
on t.id=b.id+ d- R$ \% Y. F6 T
inner join tablec c on
# s% O/ g% A! H7 Dc.id=b.id! s* W1 i8 E, w
inner join tabled d on
7 u( ^$ X- v3 m- u; G2 C; |# Gd.id=c.id
# u% ?3 R3 M6 dwhere d.key=1
' x7 U9 S& {$ d5 H# V                5 M$ N# @$ A6 Q0 g9 O6 v
解决方案:
4 Q: ], M) w/ c# l' X5 I3 ?                - Z3 g4 A, Y/ |  U! M- V% X; J; r' }

/ o( V/ j2 s& o3 x% j
. U  O  C  e9 |' u( m$ S                该synthax在Oracle SQL中不起作用。) z7 `! ~2 u4 A  Y2 j9 a% A* s9 |
在Oracle中,如果表是“键保留”的,则可以更新联接,即:
8 a- C2 r% V0 |' [* SUPDATE (SELECT a.val_a, b.val_b
/ r+ h0 m+ C# f5 X( g3 `6 f5 f; N          FROM table a2 v  k# z+ v9 V  X
          JOIN table b ON a.b_pk = b.b_pk)  Z* R+ R/ T4 z, Y6 X8 p
   SET val_a = val_b
3 O  S/ I& k" \9 D5 H假设这b_pk是的主键b,则此连接是可更新的,因为对于A的每一行,B 最多 只有一行,因此该更新是确定性的。! u0 ^" R# D+ d/ q* L
在您的情况下,由于更新后的值不依赖于另一个表,因此您可以使用具有EXIST条件的简单更新,如下所示:/ {% u# K$ `1 P1 j0 v7 A2 b0 W
UPDATE mytable t
  b' M9 K6 w0 X. e   SET t.VALUE = 'value'8 U8 I. r( E3 l; d
WHERE EXISTS ( G) R  l& ^5 H' |, G% \
       (SELECT NULL
% h. K0 c% ~' M2 Q          FROM tableb b
  ]8 S# t( N- }2 f3 b         INNER JOIN tablec c ON c.id = b.id$ m0 g& R! H+ s, g% z
         INNER JOIN tabled d ON d.id = c.id2 C" n. z, p7 C$ u9 g0 K
         WHERE t.id = b.id6 l/ Y! ~0 z% B4 y- D& O
           AND d.key = 1)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则