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就老是提示出错。
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就老是提示出错。
不考虑优化的情况下,你可以写成: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来约束.希望这个解释够清楚了.
应该用update 表 set 字段=(select 字段 from 表 where 条件) where 条件的格式写。
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