【发布时间】:2012-07-27 17:33:35
【问题描述】:
我目前正在编写更新语句以使可查询表不断更新。两个表之间的架构是相同的,内容并不重要:
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 更新?
更新
所以我的暂存数据可能会巧合地反映 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”出现无效标识符问题
【问题讨论】:
-
您想让 PRODUCTION 表中的 name 和 count 保持最新和 STAGING 表正在改变?
-
为什么不使用触发器来插入新值而不是这次更新?这次更新究竟做了什么?
-
同意,在同步表时,触发器对于保持它们实时更新非常有用。请注意变异表错误,并确保将其作为 AFTER INSERT OR UPDATE 执行。
-
@hmmftg 此更新只是为了从暂存中提取数据以使生产保持最新。类似于如何为现实生活中的示例更新天气报告。每 X 分钟左右
-
@Hermit 这很可能会成为触发器,我正在自己测试普通的sql。