举例说明:
EQ_EQUIP为设备主表,有20万数据,ABC_SB为临时新建的更新表,有37条数据:
字段介绍ERP_INVNR回路名称,EQ_CHECK_PERIOD周期值,EQ_PRE_CHECK_DATE上次检验日期,EQ_NEXT_CHECK_DATE下次检验日期,EQ_CODE设备编码,EQ_CODE也是在两个表中都是主键。
目的是把ABC_SB表里的37条数据循环更新到EQ_EQUIP表中。
SQL语句:
update EQ_EQUIP a
set (ERP_INVNR,EQ_PRE_CHECK_DATE,EQ_CHECK_PERIOD,EQ_NEXT_CHECK_DATE)
=
(
select ERP_INVNR,
EQ_PRE_CHECK_DATE,
EQ_CHECK_PERIOD,
EQ_NEXT_CHECK_DATE
from ABC_SB b
where b.EQ_CODE = a.eq_code
)
这种写法会不会出现这种问题,我把ABC_SB的37条数据通过EQ_CODE字段,更新到对应的EQ_EQUIP中,但是在设备主表EQ_EQUIP和ABC_SB临时更新表执行SQL语句时,通过字段eq_code没有不能对应上的ERP_INVNR,EQ_PRE_CHECK_DATE,EQ_CHECK_PERIOD,EQ_NEXT_CHECK_DATE这些字段的值是不是会被制成空值??
EQ_EQUIP为设备主表,有20万数据,ABC_SB为临时新建的更新表,有37条数据:
字段介绍ERP_INVNR回路名称,EQ_CHECK_PERIOD周期值,EQ_PRE_CHECK_DATE上次检验日期,EQ_NEXT_CHECK_DATE下次检验日期,EQ_CODE设备编码,EQ_CODE也是在两个表中都是主键。
目的是把ABC_SB表里的37条数据循环更新到EQ_EQUIP表中。
SQL语句:
update EQ_EQUIP a
set (ERP_INVNR,EQ_PRE_CHECK_DATE,EQ_CHECK_PERIOD,EQ_NEXT_CHECK_DATE)
=
(
select ERP_INVNR,
EQ_PRE_CHECK_DATE,
EQ_CHECK_PERIOD,
EQ_NEXT_CHECK_DATE
from ABC_SB b
where b.EQ_CODE = a.eq_code
)
这种写法会不会出现这种问题,我把ABC_SB的37条数据通过EQ_CODE字段,更新到对应的EQ_EQUIP中,但是在设备主表EQ_EQUIP和ABC_SB临时更新表执行SQL语句时,通过字段eq_code没有不能对应上的ERP_INVNR,EQ_PRE_CHECK_DATE,EQ_CHECK_PERIOD,EQ_NEXT_CHECK_DATE这些字段的值是不是会被制成空值??
update EQ_EQUIP a
set (ERP_INVNR,EQ_PRE_CHECK_DATE,EQ_CHECK_PERIOD,EQ_NEXT_CHECK_DATE)
=
(
select ERP_INVNR,
EQ_PRE_CHECK_DATE,
EQ_CHECK_PERIOD,
EQ_NEXT_CHECK_DATE
from ABC_SB b
where b.EQ_CODE = a.eq_code
)
where eq_code in (select eq_code from abc_sb);
正解,可以用where条件来限制下:
update EQ_EQUIP a
set (ERP_INVNR,EQ_PRE_CHECK_DATE,EQ_CHECK_PERIOD,EQ_NEXT_CHECK_DATE)
=
(
select ERP_INVNR,
EQ_PRE_CHECK_DATE,
EQ_CHECK_PERIOD,
EQ_NEXT_CHECK_DATE
from ABC_SB b
where b.EQ_CODE = a.eq_code
)
where exists (select 1 from abc_sb b1 where a.EQ_CODE =b1.EQ_CODE );
已连接。
SQL> create table zzw_temp1(id number,score number);表已创建。SQL> insert into zzw_temp1 values(1,20);已创建 1 行。SQL> insert into zzw_temp1 values(2,30);已创建 1 行。SQL> insert into zzw_temp1 values(3,50);已创建 1 行。SQL> create table zzw_temp2(id number,score number);表已创建。SQL> insert into zzw_temp2 values(1,100);已创建 1 行。SQL> insert into zzw_temp2 values(2,90);已创建 1 行。SQL> commit;提交完成。SQL> select * from zzw_temp1; ID SCORE
---------- ----------
1 20
2 30
3 50SQL> select * from zzw_temp2; ID SCORE
---------- ----------
1 100
2 90
SQL> update zzw_temp1 a set a.score=(select b.score from zzw_temp2 b where a.id=
b.id);已更新3行。SQL> select *from zzw_temp1; ID SCORE
---------- ----------
1 100
2 90
3SQL> rollback
2 ;回退已完成。SQL> update zzw_temp1 a set a.score=(select b.score from zzw_temp2 b where a.id=
b.id)
2 where exists (select 1 from zzw_temp2 c
3 where a.id=c.id);已更新2行。SQL> select *from zzw_temp1; ID SCORE
---------- ----------
1 100
2 90
3 50SQL>通过例子可以看到,必须限定范围