内容が不十分だったので再投稿します。


以下のAccessで実行していたSQLがあります。

UPDATE TABLEA INNER JOIN TABLEB ON TABLEA.column1 = TABLEB.column1 SET TABLEA.column1 = TABLEB.column2

テーブル名をそのままでOracleで全く同じ結果になるように修正しようと思っています。
で以下のSQLを作成したのですが

Update TableA set TableA.Column1 = (select TableB.Column2 from TableB where TableB.Column1 = TableA.Column1)

ORA-01427: single-row subquery returns more than one row
になり実行できません。
どのようにすれば同じ結果になるでしょうか?
Oracleは厳密なため同じような処理は出来ないのでしょうか?

出来るだけ影響度の少ない方法で出来ればなと思ってます。
よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2007/07/03 09:35:28
  • 終了:2007/07/10 09:40:03

回答(1件)

id:mass3 No.1

mass3回答回数118ベストアンサー獲得回数152007/07/03 10:02:44

ポイント60pt

エラーメッセージのとおりです。

「単行副問合せが1行以上の行を返しました」

したがって、副問合せ

「select TableB.Column2 from TableB where TableB.Column1 = TableA.Column1」

が必ず1行しか返らないようにすればいいです。

この例だと、「TableB.Column1」をプライマリキーかユニークキーにすればいいです。

id:matttsu

「ROWNUM=1で結果は同じになる」ことは保障されません。

とのことですが現行のAccessはどういう動きでOracleで同じ結果を出すためにはどうすればいいのかを知りたかったのです。

今回Accessと同じ結果をという目的が最優先のためテーブルの正規化は出来ればというところです。

新規に作成するのであれば当然「TableB.Column1」を一意にしたいのですが…。

2007/07/03 10:16:51
  • id:taknt
    and ROWNUM=1

    でも つけてやればいい。

    というか、SQL自体が あいまいだから エラーが出たんだけどね。

    SQLの見直し ← テーブル設計の仕様の見直し が必要。
  • id:matttsu
    Accessが曖昧なのを許すからこういうのが起こるってのは大体わかってました。
    and ROWNUM=1で結果は同じになると考えていいですかね?
    もし大丈夫であればこちらの事情でテーブル設計の見直しなしでやってしまおうかと思うんですが。
  • id:taknt
    and ROWNUM=1
    は 先頭のレコードを 用いるというものです。

    あと レコードが存在しない場合、どうなるのかは 不明ですが・・・。

    そこらへんも考慮が必要です。

  • id:matttsu
    であれば大丈夫そうですね。試してみます。
    ありがとうございました。
    申し訳ないので解答欄になにか入れてください。
    結果が大丈夫そうであれば質問を終了しますので…。
  • id:taknt
    あ、回答拒否になっているので コメントに書き込みました。
  • id:matttsu
    3名以上に…ってのに変更してみました。
  • id:mass3
    「先頭のレコードを 用いる」はやってはダメですよ。
    SQLは"order by"を指定しない限り順序は問合せ結果の順序は不定です。したがって「ROWNUM=1で結果は同じになる」ことは保障されません。
    TableA.Column1の内容が「備考」とかどうでもいいものだったらこれでもいいと思いますが。
    あくまで正攻法は「TableB.Column1」が一意であることを保障することです。
  • id:taknt
    たくさんの人に拒否に設定されているようなので 20名でも無理ですね。

    >「先頭のレコードを 用いる」はやってはダメですよ。

    暫定の措置です。
    厳密に言えば、テーブル設計をやり直さないとダメです。


  • id:matttsu
    一時的に設定変えました。
    上記の回答のコメントに書いたとおり今回に限ればAccessと同じ結果さえ出ればよいと思ってます。
  • id:taknt
    すみません、Accessと同一結果になる保証はないです。

    エラーが出ずに実行できるようになるだけです。

  • id:matttsu
    なるほど。やはりAccessと同じ結果になるSQLはOracleでは書けないってことですかね。エラーが出なくなるだけで。
  • id:taknt
    ただACCESSでも状態によっては違う結果になる恐れがあるので
    それをいえば 同一といえるかもしれませんけどね。

    つまり TableB.Column2 が
    たとえば
    1
    2
    で返ってくる場合と
    2
    1
    で返ってくる場合が 考えられます。

    ACCESSの場合 たまたま 上記で 1と更新され
    オラクルの場合 下記で 2と更新されるかもしれませんということです。

    レコードの挿入のタイミングによって結果が違うかもしれません。
    挿入した順から 抽出されるかもしれないから。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません