举例说明:
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这些字段的值是不是会被制成空值??

解决方案 »

  1.   

    可以加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 eq_code in (select eq_code from abc_sb);
      

  2.   


    正解,可以用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 );
      

  3.   

    SQL> conn btgl/btgl
    已连接。
    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>通过例子可以看到,必须限定范围
      

  4.   

    update zzw_temp1 a set a.score=说a附近有语法错误