【发布时间】:2016-07-28 22:13:28
【问题描述】:
我正在尝试更新 Oracle 中的多个列,并在经历了几个方案后,确定了下面的代码。
我的问题是,更精简的代码不会更新我需要的内容,而更复杂的代码会更新 - 我正试图通过最小的处理能力来实现这一点,因为我正在查看数十万甚至更多的更新。
所以第一个代码:
UPDATE table@database1 i2
SET (i2.access, i2.permission) =
(select
i2m.access, i2m.permission
from temporarytable ss
JOIN table2 pgm
ON ss.secgroup = pgm.string
JOIN table i2m
ON pgm.hmy = i2m.hgroup
AND ss.pername = i2m.sobjname
JOIN table2@database1 pg
ON ss.secgroup = pg.string
WHERE
pg.string = 'string' -- this limits the updates to a specific subset of data
and i2m.hmy > 0 -- this for some freak records in both tables that are missing a primary key
and pg.hmy = i2.hgroup -- this matches the key of the 'string' from above to the records i need to update
and ss.pername = i2.sobjname -- further condition on which records to update. so only the ones that match from the temp table to the target table
and ss.orig_hmy = i2.hmy) -- further condition to make sure i am updating only records matching between temp table and target table
现在,如果我运行它,而不是只更新大约 700 条与上述子查询匹配的记录,它会更新表 'table@database1' 中的所有记录,我不明白为什么(可能是我不知道的那些事情之一'不了解 Oracle :))
但是,如果我运行以下命令——唯一的区别是我将整个子查询插入到“存在的地方”中——那么这只会更新我需要的内容。我的问题是,按照我的理解,子查询运行了两次——一次在更新中,一次在 where 子句中——我会说这是对处理能力的浪费。
UPDATE table@database1 i2
SET (i2.access, i2.permission) =
(select
i2m.access, i2m.permission
from temporarytable ss
JOIN table2 pgm
ON ss.secgroup = pgm.string
JOIN table i2m
ON pgm.hmy = i2m.hgroup
AND ss.pername = i2m.sobjname
JOIN table2@database1 pg
ON ss.secgroup = pg.string
WHERE
pg.string = 'string'
and i2m.hmy > 0
and pg.hmy = i2.hgroup
and ss.pername = i2.sobjname
and ss.orig_hmy = i2.hmy)
where exists (select
i2m.access, i2m.permission
from temporarytable ss
JOIN table2 pgm
ON ss.secgroup = pgm.string
JOIN table i2m
ON pgm.hmy = i2m.hgroup
AND ss.pername = i2m.sobjname
JOIN table2@database1 pg
ON ss.secgroup = pg.string
WHERE
pg.string = 'string'
and i2m.hmy > 0
and pg.hmy = i2.hgroup
and ss.pername = i2.sobjname
and ss.orig_hmy = i2.hmy)
注意:如果它没有显示,我有多个具有相同架构的数据库。我正在尝试使用来自主模式的信息更新跨数据库的表。 Temp 表充当不同且需要更新的记录的存储库 - 如果仅 15% 与主模式不同,则没有理由更新数百万条记录。
【问题讨论】:
-
如果您不喜欢这种更新表格的方法,可以使用
merge。 -
我同意 Gordon 的观点,请务必阅读并熟悉 MERGE 方法。它将在未来支付巨大的红利。
-
" 它更新了表 'table@database1' 中的所有记录,我不明白为什么。"因为
update语句上没有where子句。 Oracle 没有具体说明这一点,在我熟悉的所有平台上,我都熟悉更新,而无需更新每一行。 -
MERGE 似乎是一种更好的方法。将考虑将更新调整为 MERGE,看看这会将我带到哪里。如果它按预期工作,我会回来确认答案。 *不确定我最初不走这条路的原因是什么
-
好的。所以 MERGE 成功了。现在我只需要知道为什么 DBMS 说 842 行受影响,而 DB 实际上只有 753 条受影响的记录。
标签: sql oracle multiple-columns database-link