有一群友需要改update语句中的驱动表
但网友的环境使用这种方法无效,他的oracle是9i,我手边没有这个环境。
该方法测试通过
UPDATE p
SET gflag = 1
WHERE EXISTS (SELECT 1
FROM t
WHERE t.region = :b2
AND t.cycle = :b1
AND t.acctid = p.acctid)
因为t表返回数据较少,所以他想让t做驱动表。
一般这种情况可以使用qb_name
UPDATE /*+ leading(t@in2) */ p
SET gflag = 1
WHERE EXISTS (SELECT /*+ qb_name(in2) */ 1
FROM t
WHERE t.region = :b2
AND t.cycle = :b1
AND t.acctid = p.acctid)
但网友的环境使用这种方法无效,他的oracle是9i,我手边没有这个环境。
只有改为可更新视图的方式来试下
update (select /*+ bypass_ujvc use_hash(p,t) leading(t) */
p.gflag
from p
inner join (select distinct acctid
from t
where t.region = :b2
and t.cycle = :b1) t
on t.acctid = p.acctid)
set gflag = 1
该方法测试通过