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

2024-01-14

我目前正在编写更新语句,以使可查询的表不断保持最新。两个表之间的架构相同,内容并不重要:

STAGING  

ID  
NAME  
COUNT    

PRODUCTION  

ID  
NAME  
COUNT

我的更新语句如下所示:

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);

需要注意的两件事是 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;

我的问题是如何修复此问题,以便表正确反映暂存中的“新”数据作为正确的 SQL 更新?

UPDATE

所以我的暂存数据可能巧合地反映了其中的内容PRODUCTION为了便于讨论,它将:

STAGING DATA TO MERGE:  

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

更新第二个

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

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

where production.name = staging.name;

然而,这会导致“staging.name”上的无效标识符问题


有两种方法可以完成您正在尝试的事情

一个是一个多列关联更新 http://psoug.org/reference/update.html

UPDATE PRODUCTION a
SET (name, count) = (
  SELECT name, count
  FROM STAGING b
  WHERE a.ID = b.ID);

DEMO http://sqlfiddle.com/#!4/ed89f/2

您可以使用merge http://psoug.org/reference/merge.html

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

DEMO http://sqlfiddle.com/#!4/ed89f/3

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于两个表之间的子查询的Oracle SQL更新 的相关文章

随机推荐