Sql 具有唯一记录的更新表A被引用到联接上没有唯一记录的表B
正如标题所示,我正在尝试更新较低级别的层次结构表a。表a中的一列a1来自另一个具有较低级别分配的表B中的一列b1。 规则是当tableA.aid=tableB=bid和filter时,将tableB.rcdind分配给tableA.asgnflg 表A.lvl_nbr=7(较低级别) 它抛出错误作为 ORA-01427:当我执行下面的更新查询时,单行子查询返回多行Sql 具有唯一记录的更新表A被引用到联接上没有唯一记录的表B,sql,database,oracle10g,Sql,Database,Oracle10g,正如标题所示,我正在尝试更新较低级别的层次结构表a。表a中的一列a1来自另一个具有较低级别分配的表B中的一列b1。 规则是当tableA.aid=tableB=bid和filter时,将tableB.rcdind分配给tableA.asgnflg 表A.lvl_nbr=7(较低级别) 它抛出错误作为 ORA-01427:当我执行下面的更新查询时,单行子查询返回多行 UPDATE tableA A SET A.asgnflg=(SELECT B.rcdind FROM (SELECT A.aid
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
我可以在子查询中进行循环,以便它检查与bid相同的aid并更新列A.asgnflg问题是,当存在重复项时,您需要哪个
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
))
问题是当存在重复项时,您需要哪个
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
))
@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的表A中更新443条记录。感谢您的回复,我想更新没有重复项但只有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
我能够从表A中更新443条记录,该表的lvl_nbr=7