1

Oracle11gの次の更新クエリで問題が発生しました。

update TABLE_A a set COL1 = 
  (SELECT b.COL2 FROM
    (SELECT ROWNUM AS ROW_NUMBER, b.COL2 from TABLE_B b where COL3 = a.COL4) 
   WHERE ROW_NUMBER = 2
  )

ORA-00904:"A"。"COL4":無効なID。

したがって、a.COL4はサブサブクエリでは認識されませんが、これを解決する方法がわかりません。

/編集。私は何をしようとしていますか?

TABLE_Aのすべてのレコードについて、TABLE_Bには複数のレコードがあります。ただし、お客様からの新しい要件:TABLE_Aは代わりに2つの新しい列を取得しますが、TABLE_Bは削除されます。したがって、サブクエリの最初のレコードの表現は最初の新しいフィールドに書き込まれ、2番目のフィールドにも同じように書き込まれます。MikeCのソリューションはROW_NUMBER=1で使用できるため、最初のレコードは簡単です。

行の例:

TABLE_A

| col0 | col1 | col2 | col3 | col4 |
------------------------------------
|      |      |dummy2|dummy3|   1  |
------------------------------------
|      |      |dummy4|dummy5|   2  |
------------------------------------

TABLE_B

| col1 | col2 | col3 |
----------------------
|  d   |name1 |   1  |
----------------------
|  d   |name2 |   1  |
----------------------
|  d   |name3 |   1  |
----------------------
|  d   |name4 |   2  |
----------------------


TABLE_A after update

| col0 | col1 | col2 | col3 | col4 |
------------------------------------
| name1| name2|dummy2|dummy3|   1  |
------------------------------------
| name4|      |dummy4|dummy5|   2  |
------------------------------------
4

5 に答える 5

0

これは問題の解決策になる可能性があると思いますが、処理するデータの量によっては、内部ステートメントに制限要因がないため、処理が非常に遅くなる可能性があります。

update
  table_a upd
set upd.col1 = (
  select
    sub.col2
  from
    (
      select
        rownum as row_number,
        b.col2 as col2,
        b.col3 as col3
      from
        table_a a,
        table_b b
      where b.col3 = a.col4
    ) sub
  where sub.row_number = 2
    and sub.col3       = upd.col4
)
于 2011-09-21T14:42:33.270 に答える
0
UPDATE TABLE_A a SET COL1 = 
  (SELECT b.COL2 FROM
    (SELECT ROWNUM AS ROW_NUMBER, b.COL2 FROM TABLE_B b, TABLE_A innerA WHERE COL3 = innerA.COL4) 
   WHERE ROW_NUMBER = 2
  )
于 2011-09-21T13:21:24.107 に答える
0

試す

update TABLE_A a set COL1 = 
  (SELECT b.COL2 FROM
    (SELECT ROWNUM AS ROW_NUMBER, b.COL2 from TABLE_B b, TABLE_A a2 where b.COL3 = a2.COL4) 
   WHERE ROW_NUMBER = 2
  )

COL3 はテーブル b から来ていると思いますが、サブクエリで ROWNUM を選択するのはなぜですか? WHERE 句からは 2 しか指定できません。

于 2011-09-21T13:20:12.907 に答える
0

このようなサブクエリの 1 つを削除できますか?

update TABLE_A a set COL1 = 
(SELECT b.COL2 FROM TABLE_B b where COL3 = a.COL4 AND ROWNUM = 2)
于 2011-09-21T13:24:00.857 に答える