Oracle SQL更新基于两个表之间的子查询

Woo*_*Moo 10 sql oracle

我目前正在编写更新语句,以使可查询表始终保持最新状态.两个表之间的模式相同,内容并不重要:

STAGING  

ID  
NAME  
COUNT    

PRODUCTION  

ID  
NAME  
COUNT
Run Code Online (Sandbox Code Playgroud)

我的更新语句如下所示:

update PRODUCTION  
set name = (select stage.name from staging stage where stage.name=name  and rownum <2),  
    count =   (select stage.countfrom staging stage where stage.count=count  and rownum <2);
Run Code Online (Sandbox Code Playgroud)

需要注意的两点是:1)在更新结束时没有where子句(这可能是问题)和2)更新后的所有记录都具有相同的值.我的意思是:

BEFORE UPDATE:  

1,"JOHN", 12;  
2,"STEVE",15;  
3,"BETTY",2;  

AFTER UPDATE  

    1,"JOHN", 12;  
    2,"JOHN",12;  
    3,"JOHN",12;
Run Code Online (Sandbox Code Playgroud)

我的问题是如何解决这个问题,以便表格正确地反映来自登台的"新"数据作为正确的SQL更新?

UPDATE

因此,我的暂存数据可能会巧合地反映其中的内容PRODUCTION并且为了讨论它将:

STAGING DATA TO MERGE:  

    1,"JOHN", 12;  
    2,"STEVE",15;  
    3,"BETTY",2; 
Run Code Online (Sandbox Code Playgroud)

更新第二个

我想要运行的查询是这样的:

update PRODUCTION
set production.name = staging.name,  
    production.count = staging.count

where production.name = staging.name;
Run Code Online (Sandbox Code Playgroud)

但是这会导致"staging.name"上的标识符问题无效

Con*_*rix 33

有两种方法可以做你正在尝试的事情

一个是多列相关更新

UPDATE PRODUCTION a
SET (name, count) = (
  SELECT name, count
  FROM STAGING b
  WHERE a.ID = b.ID);
Run Code Online (Sandbox Code Playgroud)

DEMO

您可以使用合并

MERGE INTO PRODUCTION a
USING ( select id, name, count 
          from STAGING ) b
ON ( a.id = b.id )
WHEN MATCHED THEN 
UPDATE SET  a.name = b.name,
            a.count = b.count
Run Code Online (Sandbox Code Playgroud)

DEMO