回答

收藏

Oracle合并与选择然后插入或更新

技术问答 技术问答 376 人阅读 | 0 人回复 | 2023-09-14

什么更快?+ F+ U8 \# @8 O
合并语句
8 d" ]& r* u& W) W+ L" J" L4 B+ t+ C( K3 p. d    MERGE INTO table_name " X: \: A% t6 B$ y$ W7 ^- Q
     USING dual
/ n, J; M0 L6 j- @' D* N' N     ON (row_id = 'some_id'): p0 m, q6 k$ Y$ r9 s
    WHEN MATCHED THEN
" a' a6 R  d3 ?     UPDATE SET col_name = 'some_val'
4 e* f9 S  M! b& T+ h    WHEN NOT MATCHED THEN2 q) W8 e$ k# R6 o6 T) |; g. @
     INSERT (row_id, col_name)
- I% D' K6 `/ g" H     VALUES ('some_id', 'some_val')
" K% K8 y; Q6 v7 V7 E5 u1 T或者
  }' x% O+ I$ O2 h查询选择语句,然后使用更新或插入语句。2 F% ~7 s  C9 ~* `+ O: `2 {: V/ M
    SELECT * FROM table_name where row_id = 'some_id'
( Y- P" Z$ E) h' l) `如果rowCount == 07 i2 @( ]9 n2 H7 u2 c; `0 M& `+ ?
    INSERT INTO table_name (row_id,col_name) VALUES ('some_id','some_val')
4 z5 e: z" |# D8 t; v别的
: m" n1 |8 x6 d" j4 ]    UPDATE table_name SET col_name='some_val' WHERE row_id='some_id'
# h, s; W, J/ {, J2 i                ! g+ O( m5 u9 \4 o* t# A
解决方案:
- P8 _" o9 E' m+ j                . w. ]3 G! h1 N. r% s$ b
+ c1 D0 d2 {  h

7 _9 V. y" t4 ^- G+ n/ ]) k1 D7 c                的 经验法则 是,如果你可以在一个SQL做到这一点,它会比通常在多个SQL语句,这样做有更好的表现。
6 W+ ]2 |" M! i如果可以,我会选择MERGE。+ F1 \# C" p7 B5 q& _* c, V" Y
另外-另一个建议:您可以避免在语句中重复数据,例如:: r, Q  G6 r* A# j3 {  w; `3 a7 V
MERGE INTO table
  {' W  ?8 V9 W7 u/ m7 ^ USING (SELECT 'some_id' AS newid,$ F" F1 g6 o2 o6 l
               'some_val' AS newval
1 I7 G0 p: O0 ~5 N) K2 S: ~        FROM dual)
; t1 u+ @6 c9 P: i' x ON (rowid = newid)7 M$ d* r8 ?. |+ O
WHEN MATCHED THEN( ]9 ^  c- w" J: p- e' ~' }$ ~
UPDATE SET colname = newval
0 \' |+ ?( Z7 q: IWHEN NOT MATCHED THEN
6 s. g+ _/ [4 T3 }# Q* l INSERT (rowid, colname)
7 Z6 N! }: H  A) J9 F" S5 W VALUES (newid, newval)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则