Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 具有唯一记录的更新表A被引用到联接上没有唯一记录的表B_Sql_Database_Oracle10g - Fatal编程技术网

Sql 具有唯一记录的更新表A被引用到联接上没有唯一记录的表B

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

正如标题所示,我正在尝试更新较低级别的层次结构表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 ,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