1

タイトルが示すように、下位レベルの割り当てを持つ別の tableB の列 b1 から、tableA の下位レベル .1 列 a1 の階層 tableA を更新しようとしています。ルールは、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、重複がある場合にどのフラグが必要かです。

2 つの簡単なオプションがあります。1 つ目は、 を使用して任意の値を取得することです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)

2 つ目は、集計関数を使用することです。

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 に答える