1

表1

Tripid  sequence Pattern
  1       1       
  1       2
  1       3
  2       1   
  2       2 

表2

Tripid Pattern
  1      A
  2      B

テーブル 1 のパターンを更新しようとしています。最終結果は次のようになります。

Tripid  sequence Pattern
  1       1        A
  1       2        A
  1       3        A
  2       1        B
  2       2        B

私が使用するコード:

update table1
set table1.pattern = 
    (select pattern from table2 where table1.tripid = table2.tripid) 
where exists 
    (select pattern from table2 where table1.tripid = table2.tripid)

Oracle データベース エラー: ORA-01427: 単一行のサブクエリが複数の行を返します

Oracle 10gで正しく行う方法は?

4

2 に答える 2

2

これにはMERGEステートメントを使用できます。

クエリ:

select * from t1

結果:

| TRIPID | SEQ | PATTERN |
|--------|-----|---------|
|      1 |   1 |  (null) |
|      1 |   2 |  (null) |
|      1 |   3 |  (null) |
|      2 |   1 |  (null) |
|      2 |   2 |  (null) |

クエリ:

merge into t1
using t2
on (t1.tripid = t2.tripid)
when matched then update
set pattern = t2.pattern

クエリ:

select * from t1

結果:

| TRIPID | SEQ | PATTERN |
|--------|-----|---------|
|      1 |   1 |       A |
|      1 |   2 |       A |
|      1 |   3 |       A |
|      2 |   1 |       B |
|      2 |   2 |       B |
于 2015-12-10T05:10:25.823 に答える
0

おそらく、tripid は table2 で一意ではありませんか?

それはあなたの例にありますが、実際のデータでは一意ですか?

DROP  table table1;
create table table1(tripid number, sequence number, pattern  CHAR(1));
insert into table1 values (1,1,null);
insert into table1 values (1,2,null);
insert into table1 values (1,3,null);
insert into table1 values (2,1,null);
insert into table1 values (2,2,null);

DROP  table table2;
create table table2(tripid number, pattern CHAR(1));
insert into table2 values (1,'A');
insert into table2 values (2,'B');

commit;

select table2.tripid, table2.pattern from table2,table1 where table1.tripid = table2.tripid;


update table1
set table1.pattern = 
    (select pattern from table2 where table1.tripid = table2.tripid) 
where exists 
    (select pattern from table2 where table1.tripid = table2.tripid);

commit;

select * from table1;

戻り値:

Table dropped.
Table created.
1 row created.
1 row created.
1 row created.
1 row created.
1 row created.
Table dropped.
Table created.
1 row created.
1 row created.
Commit complete.

    TRIPID PATTERN
---------- -------
         1 A      
         1 A      
         1 A      
         2 B      
         2 B      

5 rows selected.
5 rows updated.


    TRIPID   SEQUENCE PATTERN
---------- ---------- -------
         1          1 A      
         1          2 A      
         1          3 A      
         2          1 B      
         2          2 B      

5 rows selected.

これは、適切なデータがあれば、Oracle (およびクエリ) が完全に機能することを証明しています。

キリスト教徒

于 2015-12-21T16:02:48.693 に答える