我目前正在编写更新语句,以使可查询表始终保持最新状态.两个表之间的模式相同,内容并不重要:
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)
您可以使用合并
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)
| 归档时间: |
|
| 查看次数: |
126421 次 |
| 最近记录: |