ORA-01427:single-row subquery returns more than one row一个更新sql语句遇到的问题:
环境:数据库 DBA, 数据库 DBB,两个数据库做的DBLINK,数据表 TAA,TAB 位于数据库DBA,通过数据库DBB 可以访问,数据表 TBC 位于数据库 DBB,需要 从 TAA,TAB 更新 TBC 中的数据。
1、在数据库 DBB 做一个视图 V_AB 查询 TAA,TAB 的数据
CREATE VIEW V_AB AS
SELECT TAA.COL_CODE, TAA.COL_TYPE, SUM(TAB.COL_QTY) QTY_SUM
FROM TAA, TAB
WHERE TAA.COL_CODE=TAB.COL_CODE
GROUP BY TAA.COL_CODE, TAA.COL_TYPE 更新表 TBC 的数据
UPDATE TBC SET QTY_SUM=
(SELECT QTY_SUM
FROM V_AB
WHERE TBC.COL_CODE=V_AB.COL_CODE AND TBC.COL_TYPE=V_AB.COL_TYPE
)WHERE TBC.COL_CRTDATE='2010-05-27'
AND EXISTS (SELECT 1 FROM V_AB WHERE TBC.COL_CODE=V_AB.COL_CODE AND TBC.COL_TYPE=V_AB.COL_TYPE)
执行出错:ORA-01427
2、在数据库 DBB 做一个表 V_AB 查询 TAA,TAB 的数据
CREATE TABLE V_AB AS
SELECT TAA.COL_CODE, TAA.COL_TYPE, SUM(TAB.COL_QTY) QTY_SUM
FROM TAA, TAB
WHERE TAA.COL_CODE=TAB.COL_CODE
GROUP BY TAA.COL_CODE, TAA.COL_TYPE 更新表 TBC 的数据
UPDATE TBC SET QTY_SUM=
(SELECT QTY_SUM
FROM V_AB
WHERE TBC.COL_CODE=V_AB.COL_CODE AND TBC.COL_TYPE=V_AB.COL_TYPE
)WHERE TBC.COL_CRTDATE='2010-05-27'
AND EXISTS (SELECT 1 FROM V_AB WHERE TBC.COL_CODE=V_AB.COL_CODE AND TBC.COL_TYPE=V_AB.COL_TYPE)
执行成功。
说明:表TBC 的主键列:COL_CRTDATE,COL_CODE, COL_TYPE
对以上执行结果不解,不清楚通过视图更新的问题在哪里?
视图 V_AB 和 表 V_AB 的数据是一样,同样的更新语句,用表更新成功过,用视图更新出错。
环境:数据库 DBA, 数据库 DBB,两个数据库做的DBLINK,数据表 TAA,TAB 位于数据库DBA,通过数据库DBB 可以访问,数据表 TBC 位于数据库 DBB,需要 从 TAA,TAB 更新 TBC 中的数据。
1、在数据库 DBB 做一个视图 V_AB 查询 TAA,TAB 的数据
CREATE VIEW V_AB AS
SELECT TAA.COL_CODE, TAA.COL_TYPE, SUM(TAB.COL_QTY) QTY_SUM
FROM TAA, TAB
WHERE TAA.COL_CODE=TAB.COL_CODE
GROUP BY TAA.COL_CODE, TAA.COL_TYPE 更新表 TBC 的数据
UPDATE TBC SET QTY_SUM=
(SELECT QTY_SUM
FROM V_AB
WHERE TBC.COL_CODE=V_AB.COL_CODE AND TBC.COL_TYPE=V_AB.COL_TYPE
)WHERE TBC.COL_CRTDATE='2010-05-27'
AND EXISTS (SELECT 1 FROM V_AB WHERE TBC.COL_CODE=V_AB.COL_CODE AND TBC.COL_TYPE=V_AB.COL_TYPE)
执行出错:ORA-01427
2、在数据库 DBB 做一个表 V_AB 查询 TAA,TAB 的数据
CREATE TABLE V_AB AS
SELECT TAA.COL_CODE, TAA.COL_TYPE, SUM(TAB.COL_QTY) QTY_SUM
FROM TAA, TAB
WHERE TAA.COL_CODE=TAB.COL_CODE
GROUP BY TAA.COL_CODE, TAA.COL_TYPE 更新表 TBC 的数据
UPDATE TBC SET QTY_SUM=
(SELECT QTY_SUM
FROM V_AB
WHERE TBC.COL_CODE=V_AB.COL_CODE AND TBC.COL_TYPE=V_AB.COL_TYPE
)WHERE TBC.COL_CRTDATE='2010-05-27'
AND EXISTS (SELECT 1 FROM V_AB WHERE TBC.COL_CODE=V_AB.COL_CODE AND TBC.COL_TYPE=V_AB.COL_TYPE)
执行成功。
说明:表TBC 的主键列:COL_CRTDATE,COL_CODE, COL_TYPE
对以上执行结果不解,不清楚通过视图更新的问题在哪里?
视图 V_AB 和 表 V_AB 的数据是一样,同样的更新语句,用表更新成功过,用视图更新出错。
解决方案 »
- 请高手说说dedicated server和MTS server各自的特点和区别
- oracle sqlldr 出现达到提交点 - 逻辑记录计数 86
- 绝对的的难题, 没有遇到过这样问题的人, 很难想象为什么会这样!
- oracle 分组语句求解
- 请教如何在sql语句中实现某字段值累加1?
- 如何得到游标中的记录数
- 请大师帮我看一下这段代码为什么不能正确执行?
- 跪求oracle9.2 的 patch 2428356 补丁用于oracle 的com+支持。[email protected]
- 那儿有Oracle 9i for winnt/2k下载?
- 怎么在PLSQL表中添加时间戳
- 请教按列分组累计的方法
- JAVA GUI
使用其他方式处理了,在insert数据的时候把该字段数据计算好,不再使用update语句更新。