1

正如标题所示,我正在尝试为较低级别的.one 列 a1 更新层次结构表 A,该列来自 tableA,来自另一个 tableB 中的列 b1,该列具有较低级别的分配。规则是在tableA.aid=tableB=bid 和过滤tableA.lvl_nbr=7(较低级别)时将tableB.rcdind 分配给tableA.asgnflg

它抛出错误

ORA-01427: 当我执行以下更新查询时,单行子查询返回多行。

UPDATE tableA A
SET A.asgnflg=(SELECT B.rcdind FROM
(SELECT  A.aid ,C.rcd_ind FROM  tableA A,(SELECT DISTINCT B.bid,B.rcdind FROM tableA     A,tableB B WHERE A.aid=B.bid)C 
WHERE A.aid=C.bid
AND A.lvl_nbr=7
))

表 A 中的援助计数为 443,其中表 B 中的不同投标计数为 138。

我可以在子查询中有循环,以便它检查与投标相同的帮助并更新列 A.asgnflg

4

2 回答 2

1

问题是rcdind当有重复时你想要哪个标志。

你有两个简单的选择。第一种是使用 获取任意值rownum = 1

UPDATE tableA A
SET A.asgnflg=(SELECT B.rcdind FROM
(SELECT  A.aid ,C.rcd_ind FROM  tableA A,(SELECT DISTINCT B.bid,B.rcdind FROM tableA     A,tableB B WHERE A.aid=B.bid)C 
WHERE A.aid=C.bid
AND A.lvl_nbr=7
)
where rownum = 1)

第二种是使用聚合函数:

UPDATE tableA A
SET A.asgnflg=(SELECT min(B.rcdind) FROM
(SELECT  A.aid ,C.rcd_ind FROM  tableA A,(SELECT DISTINCT B.bid,B.rcdind FROM tableA     A,tableB B WHERE A.aid=B.bid)C 
WHERE A.aid=C.bid
AND A.lvl_nbr=7
))
于 2013-06-14T06:37:53.193 回答
0

@Gordan 感谢您的回复,我想更新没有重复但只有 lvl_nbr =7 的表,所以我使用了以下查询。

UPDATE tableA SET asgnflg = (CASE WHEN asgnflg IS NULL AND A.lvl_nbr=7 THEN (SELECT     C.rcd_ind FROM (SELECT DISTINCT a.aid,lvl_nbr,decode(max(b.rcd_ind),'Y','Y','N')     crnt_rcd_ind     FROM tableA, TABLEB WHERE A.aid=B.bid(+) AND A.lvl_nbr(+)=7 GROUP BY         A.aid,hrchy_lvl_nbr) C WHERE A.AID=C.AID) ELSE asgnflg END ) WHERE A.lvlnbr=7

我能够从具有 lvl_nbr=7 的 tableA 更新 443 条记录

于 2013-06-17T10:07:31.403 回答