Sql Oracle更新查询-游标
我想从SecondTable更新FirstTable,但是有很多复杂的地方。 这是主要查询:Sql Oracle更新查询-游标,sql,oracle,Sql,Oracle,我想从SecondTable更新FirstTable,但是有很多复杂的地方。 这是主要查询: UPDATE x.FirstTable Table1 set Table1.UpdatedColumn = ( SELECT Table2.V_PROD_CODE FROM y.SecondTable Table2 WHERE Table2.XX_V_ACCOUNT_ID1 = Table1.XX_V_ACCOUNT_ID1 AND Table2.XX_V_ACCOUNT_ID2 = T
UPDATE x.FirstTable Table1
set Table1.UpdatedColumn = (
SELECT Table2.V_PROD_CODE
FROM y.SecondTable Table2
WHERE Table2.XX_V_ACCOUNT_ID1 = Table1.XX_V_ACCOUNT_ID1
AND Table2.XX_V_ACCOUNT_ID2 = Table1.XX_V_ACCOUNT_ID2
AND Table2.XX_V_ACCOUNT_ID3 = Table1.XX_V_ACCOUNT_ID3
AND Table2.c_Date between '17-Apr-2018' and '27-Apr-2018'
AND Table2.c_DATE = Table1.c_date)
WHERE Table1.c_date between '17-Apr-2018' and '27-Apr-2018'
AND length(Table1.xx_v_account_id1) = 12;
时间太长了,所以我考虑创建一个光标:
create or replace procedure wco as
cursor UpdateCursor is
SELECT Table2.V_PROD_CODE
FROM y.SecondTable Table2
INNER JOIN x.FirstTable Table1 on SUBSTR(Table1.V_CAST_REF_CODE, 6, 8) = SUBSTR(Table2.V_CAST_REF_CODE, 6, 8)
WHERE Table2.XX_PRODUCT_CODECCOUNT_ID1 = Table1.XX_PRODUCT_CODECCOUNT_ID1
AND Table2.XX_PRODUCT_CODECCOUNT_ID2 = Table1.XX_PRODUCT_CODECCOUNT_ID2
AND Table2.XX_PRODUCT_CODECCOUNT_ID3 = Table1.XX_PRODUCT_CODECCOUNT_ID3
AND Table2.fic_mis_date between '17-Apr-2018' and '27-Apr-2018'
AND Table2.c_DATE = Table1.c_date
for update;
v_PRODUCT_CODE Table2.V_PROD_CODE%type;
begin
open UpdateCursor;
loop
fetch UpdateCursor into v_PRODUCT_CODE;
exit when UpdateCursor%notfound;
update XXBADWH.xxba_dwh_instrument_master INST
set INST.v_product_code = v_PRODUCT_CODE
WHERE current of UpdateCursor
AND INST.fic_mis_date between '17-Apr-2018' and '27-Apr-2018'
AND length (INST.xx_v_account_id1) = 12;
end loop;
close UpdateCursor;
end;
exec wco;
drop procedure wco;
这个查询有什么问题?还有更好的做法吗?对于此查询:
UPDATE x.FirstTable Table1
SET Table1.UpdatedColumn = (
SELECT Table2.V_PROD_CODE
FROM y.SecondTable Table2
WHERE Table2.XX_V_ACCOUNT_ID1 = Table1.XX_V_ACCOUNT_ID1 AND
Table2.XX_V_ACCOUNT_ID2 = Table1.XX_V_ACCOUNT_ID2 AND
Table2.XX_V_ACCOUNT_ID3 = Table1.XX_V_ACCOUNT_ID3 AND
Table2.c_Date between DATE '2018-04-17' and DATE '2018-04-27' AND
Table2.c_DATE = Table1.c_date
)
WHERE Table1.c_date between DATE '2018-04-17' and DATE '2018-04-27' AND
length(Table1.xx_v_account_id1) = 12;
您需要在表1(长度(xx_v_账户id1)、c_日期)
和表2(xx_v_账户id1、xx_v_账户ID2、xx_v_账户ID3、c_日期)
我将从索引开始(在
select
select语句中测试)。游标很少是获得更好性能的途径。解释计划是什么?为什么您希望逐行更新比单个更新语句更快?那么我如何优化它?是什么让您认为查询有问题?错误消息?结果不正确???第一个查询花费的时间太长,第二个查询有错误,但显然第二个查询没有解决我们的主要问题,即性能,因为我使用的是游标