具有唯一记录的更新表A被引用到表B,其在连接上没有唯一记录

时间:2013-06-14 06:01:01

标签: sql database oracle10g

正如标题所暗示的那样,我正在尝试更新层次表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

2 个答案:

答案 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