正如标题所暗示的那样,我正在尝试更新层次表aA,用于更低级别.one列a1,它来自tableA,来自另一个具有较低级别分配的tableB中的列b1。 当tableA.aid = tableB = bid和filter时,规则是将tableB.rcdind分配给tableA.asgnflg tableA.lvl_nbr = 7(较低级别)
它会抛出错误
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
答案 0 :(得分: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
))
答案 1 :(得分: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
我能够从tableA更新443条记录,其中包含lvl_nbr = 7