有a,b兩張表,a表有欄位tdzh,wjlj,id,b表有tdzh,wjlj,jsydid
現在要把a表的id更新到b表的jsydid上,判斷條件是兩張表的wjlj和tdzh,但是b表的wjlj需要截取一部分才能與a表的wjlj相等,
那現在陳述句怎樣寫比較好?以下是我寫的陳述句,但是效率太低了
DECLARE
CURSOR csr_data IS
SELECT *
FROM gltpid;
BEGIN
FOR a IN csr_data
LOOP
UPDATE dzdagxb b
SET
b.jsydid = a.id
WHERE b.wjlj = substr(b.wjlj,instr(b.wjlj,'/',1,1),instr(b.wjlj,'/',1,5)+instr(b.wjlj,'/',1,1)-2)
and
a.dah = b.tdzh ;
END LOOP;
END;
uj5u.com熱心網友回復:
多commit吧uj5u.com熱心網友回復:
補充一下a表一條資料對應b表多條資料,所以a表的一個id會給b表多條資料都替換jsydiduj5u.com熱心網友回復:
1. 考慮下Merge into.2. b.wjlj = substr(b.wjlj,instr(b.wjlj,'/',1,1),instr(b.wjlj,'/',1,5)+instr(b.wjlj,'/',1,1)-2)
怎么都是b的欄位,考慮下如何優化這個函式吧。看看用正則運算式能不能使其簡便點
3.資料多試試bulk collect. 或者按條數commit.
uj5u.com熱心網友回復:
在end loop 后面加commit嗎?
uj5u.com熱心網友回復:
--為啥要用游標呢?
--思路是 使用update join 替換掉游標
update b
set b.jsydid =
(select a.id
from a
where a.tdzh = b.tdzh
and instr(b.wjlj, a.wjlj) --替換掉了 a.wjlj = substr(b.wjlj,instr(b.wjlj,'/',1,1),instr(b.wjlj,'/',1,5)+instr(b.wjlj,'/',1,1)-2)
and
)
where exists (select 1
from a
where a.tdzh = b.tdzh
and instr(b.wjlj, a.wjlj)
);
uj5u.com熱心網友回復:
上面的代碼有錯誤,使用這個
update b
set b.jsydid =
(select a.id
from a
where a.tdzh = b.tdzh
and instr(b.wjlj, a.wjlj)=1 --替換掉了 a.wjlj = substr(b.wjlj,instr(b.wjlj,'/',1,1),instr(b.wjlj,'/',1,5)+instr(b.wjlj,'/',1,1)-2)
and
)
where exists (select 1
from a
where a.tdzh = b.tdzh
and instr(b.wjlj, a.wjlj)=1
);
uj5u.com熱心網友回復:
我服自己了,上面的依然有問題,沒有環境除錯,見諒!update b
set b.jsydid =
(select a.id
from a
where a.tdzh = b.tdzh
and instr(b.wjlj, a.wjlj) = 1)
where exists (select 1
from a
where a.tdzh = b.tdzh
and instr(b.wjlj, a.wjlj) = 1);
uj5u.com熱心網友回復:
效率低是因為你的陳述句沒用到索引,資料量大也可以分批提交轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/102116.html
標籤:開發
上一篇:oracle匯入dat檔案亂碼
