UPDATE DEV_STATUS_CODE_INFO SET STATUS_NAME = A.STATUS_NAME FROM(
  SELECT * FROM LCDB.DEV_STATUS_CODE_INFO WHERE DEV_TYPE_CODE = '01' AND STATUS_NAME LIKE '钱箱票箱%'
) AS A 
WHERE 
DEV_STATUS_CODE_INFO.DEV_TYPE_CODE = A.DEV_TYPE_CODE AND 
DEV_STATUS_CODE_INFO.STATUS_ID = A.STATUS_ID AND 
DEV_STATUS_CODE_INFO.PART_TYPE = A.PART_TYPE
DEV_STATUS_CODE_INFO表的主键值为DEV_TYPE_COD,STATUS_ID ,PART_TYPE 。
现在想把 lcdb中DEV_STATUS_CODE_INFO表中的数据更新到当前数据库中去。请问上面的写法不知道哪里出错了。我记得sql service这样应该没有问题的。不知道为什么oracle就老是提示出错。

解决方案 »

  1.   

    不了解SQLSERVER,不过你这语句在ORACLE里肯定是错的。原因在于FROM子句不能出现在这里.
    不考虑优化的情况下,你可以写成:UPDATE DEV_STATUS_CODE_INFO B SET STATUS_NAME = 
      (SELECT STATUS_NAME FROM LCDB.DEV_STATUS_CODE_INFO A
       WHERE A.DEV_TYPE_CODE = B.DEV_TYPE_CODE AND 
             A.STATUS_ID = B.STATUS_ID AND 
             A.PART_TYPE = B.PART_TYPE
       ) 

    WHERE B.DEV_TYPE_CODE = '01' AND B.STATUS_NAME LIKE '钱箱票箱%'注意其中表别名的使用. Update中可以使用SUB QUERY(括号内的部分),但必须保证对主句更新的每条记录,SUB-QUERY都只返回一条记录.因你的业务约定(DEV_TYPE_CODE,STATUS_ID,PART_TYPE)为主键, 所以B中每条记录的组合在A中可以唯一找到一条记录(或无),所以语句执行肯定成功. 另,看你的意思不是所有记录都要更新,所以在主句中需加上过滤条件DEV_TYPE_CODE和STATUS_NAME来约束.希望这个解释够清楚了.
      

  2.   

    sql server是可以这么写的,但这是oracle
    应该用update 表 set 字段=(select 字段 from 表 where 条件) where 条件的格式写。
      

  3.   

    应该用update   表   set   字段=(select   字段   from   表   where   条件)   where   条件的格式写。(select   字段   from   表   where   条件)不能返回多条数据
      

  4.   

    两表数据关联的UPDATE表tb1及数据如下:
            ID          A          B
    ---------- ---------- ----------
             1         10         20
             2          1          2
             3          3          2表tb2及数据如下:
            ID          A          B
    ---------- ---------- ----------
             1         10         20
             2         10         20根据表tb2的id更新表tb1对应的a,b的值。update tb1 set (a,b) = (select a,b from tb2 where id = tb1.id) where id in (select distinct id from tb2)        ID          A          B
    ---------- ---------- ----------
             1         10         20
             2         10         20
             3          3          2
    ---------------------------------------------------------------------------------------------------------
    表tb2及数据如下:
            ID          A          B
    ---------- ---------- ----------
             1         10         20
             2         10         20
             3          3          2
             1         20         40
             2         20         40根据ID分组求A,B的和,然后更新表tb1update tb1 set (a,b) = (select sum(a),sum(b) from tb2 where id = tb1.id) where id in (select distinct id from tb2)        ID          A          B
    ---------- ---------- ----------
             1         30         60
             2         30         60
      

  5.   

    呵呵,原来照抄也能得分...写得多得分多呀.楼上的distinct的写法可是画蛇添足呀. 还有如果如果条件要求id在TB2中出现, 也别用in, 建议使用exists.