|
为了保持查询表的最新状态,我目前正在编写更新的句子。两个表之间的结构相同,内容也不重要:" L/ Y; l( O6 O0 c& _" {
STAGINGID NAME COUNTPRODUCTIONID NAME COUNT我的更新语句如下:' F$ T c6 q0 l
update PRODUCTION set name = (select stage.name from staging stage where stage.name=name and rownum 需要注意的两件事是:1)更新结束时没有where子句(这可能是问题所在); 2)更新后的所有记录都有相同的值。我的意思是:
- p% b. J' @3 `+ j1 p5 _, XBEFORE UPDATE:1,"JOHN",12; 2,"STEVE",15; 3,"BETTY",2;AFTER UPDATE 1,"JOHN",12、 2,"JOHN",12、 3,"JOHN",12;我的问题是如何解决这个问题,使表能够正确反映舞台上的新数据SQL更新?2 i- F/ k1 h; y& D: Y+ x
更新
# J5 s8 g5 M9 e1 ~5 F) @/ [因此,我的登台数据可以恰到好处地反映内容,PRODUCTION为便于讨论,它将:
& F+ g6 c8 s( y9 FSTAGING DATA TO MERGE: 1,"JOHN",12、 2,"STEVE",15、 3,"BETTY",2;更新第二个1 }# m; `! b5 B5 n* `
我认为运行查询是这样的:
" [3 Y5 q1 t( m& ?4 z# Hupdate PRODUCTIONset production.name = staging.name, production.count = staging.countwhere production.name = staging.name;但这将导致 staging.name有无效的标志符问题
; ~1 F( G: x' n- [
. D$ Z* O8 P; h# {5 ~: c 解决方案: 6 w! K) w* u' @
有两种方法可以做你想尝试的事情
1 @ }" k8 k9 b; G; |6 T- w一是多列相关更新
0 ^6 @. o7 s# ]; mUPDATE PRODUCTION aSET (name,count) = ( SELECT name,count FROM STAGING b WHERE a.ID = b.ID);演示7 y5 s' [6 t) a3 i
可使用合并% ^; S& ?2 C# G& T$ o
MERGE INTO PRODUCTION aUSING ( select id,name,count from STAGING ) bON ( a.id = b.id )WHEN MATCHED THEN UPDATE SET a.name = b.name, a.count = b.count演示 |
|