2

私は3つのテーブルを手に入れました:

t1.columns: a,c
t2.columns: a,b
t3.columns: b,c,d

ここで、t1.c を t3.d で更新する必要があります。しかし、t1.c = t3.c を使用して t3 から t1 を更新することはできません。t3.b = t2.b および t1.a = t2.a も実行する必要があります。

私はこのようなことを試しました:

UPDATE table1 t1
   SET t1.c = (select t3.d
               from table2 t2, table3 t3
               where t2.b = t3.b and t1.a = t2.a)                                  
 WHERE EXISTS ( SELECT 1 FROM table2 t2, table3 t3 WHERE t1.c = t3.c and t1.a = t2.a);

このコードはエラー メッセージを生成します: ORA-01427: 単一行のサブクエリが複数の行を返します

4

4 に答える 4

3

t1 と t2 または t2 と t3 の間に 1 対多の関係がある場合、t1 の各行に対して多くの一致が得られます。t1 の同じ行に属する t3 のすべての行が d に同じ値を持つことがわかっている場合は、 を使用DISTINCTして (同一の) 重複を削除できます。

UPDATE table1 t1
   SET t1.c = (select DISTINCT t3.d
               from table2 t2, table3 t3
               where t2.b = t3.b and t1.a = t2.a)                                  
 WHERE EXISTS ( SELECT 1 FROM table2 t2, table3 t3 WHERE t1.c = t3.c and t1.a = t2.a);
于 2013-03-26T15:28:15.493 に答える
1

複数の行を返すサブクエリがあります。rownum1 行だけを取得するために使用します。

UPDATE table1 t1
   SET t1.c = (select d
               from (select t3.d
                     from table2 t2 join table3 t3
                          on t2.b = t3.b 
                     where t1.a = t2.a
                    ) t
                where rownum = 1
               )                                
 WHERE EXISTS ( SELECT 1 FROM table2 t2, table3 t3 WHERE t1.c = t3.c and t1.a = t2.a);
于 2013-03-26T15:54:23.050 に答える
1

混乱して申し訳ありませんが、私はそれを解決しました:

UPDATE table t1
SET t1.c = (select t3.d from table3 t3, table2 t2
                          where t1.a = t2.a and t2.b = t3.b and t3.c = t1.c)
 WHERE EXISTS ( SELECT 1 FROM table1 t1, table2 t2 WHERE t1.a = t2.a and t2.b = t3.b and t3.c = t1.c)
于 2013-03-27T09:06:53.983 に答える