A5:SQL Mk-2

開発のこと、日々のこと

別テーブルの値で更新をしたい

ホーム フォーラム A5:SQL Mk-2掲示板 別テーブルの値で更新をしたい

6件の投稿を表示中 - 1 - 6件目 (全6件中)
  • 投稿者
    投稿
  • #21123 返信
    ゲスト

    テーブルA内のカラムに対してテーブルB内のカラムの値で更新するためにUPDATE文を使いたいのですが、なかなかうまくいきません。
    ネットで調べながらUPDATE JOINやサブクエリを使うやり方を試してはいますが、エラーが消えず困っています。何かいい方法はないのでしょうか?

    #21135 返信
    ゲスト

    【追記】
    エラー内容はいずれも「キーワード”SET”が指定されていません」と出てきました。

    #21138 返信
    せみ
    ゲスト

    りさん

    よそ者がでしゃばるのも恐縮ですが、ここはA5:SQL Mk-2掲示板ですので、SQLの文法等に関する質問は他でされた方がより的確なアドバイスをもらえると思います。
    ポイントとしては
    ・SQL文がないです(最も肝心です)
    ・なんのDBを使っているのか?
    ・エラー内容にエラーコードはありませんか?
    ・各所にあるサンプルのSQLを、何も変えずに実行して成功するかどうか?
    ・自分のSQLと比べて異なる箇所を探す
    です。

    #21151 返信
    松原正和
    キーマスター

    りさん、せみさんこんにちは。
     
    はい、別テーブルと結合してのUPDATEはSQL標準ではないので各DB製品ごとに構文は異なります。(対応しないDB製品もあります。)
     
    週末くらいしか掲示板の書き込みができず、返信が遅くなってはしまいますが、それでもよろしければ多少お教えできるかもしれません。りさんの使用するDB製品は何でしょうか?

    #21167 返信
    ゲスト

    お忙しい中返信ありがとうございます。

    ・製品はOracleです。
    ・SQL文ですが、主に以下の3パターンで試していました(参考元のサイトから引用)。
    (1)
    UPDATE {テーブル1}
    SET {テーブル1}.{列2} = {テーブル2}.{列2}
    ,{テーブル1}.{列3} = {テーブル2}.{列3}
    FROM {テーブル1} (INNER/LEFT) JOIN {テーブル2} ON {テーブル1}{列1} = {テーブル2}{列1}
    WHERE 条件
    ;

    (2)
    UPDATE TABLE_A
    SET (TABLE_A.TARGET_COL_1
    TABLE_A.TARGET_COL_2
    = (SELECT TAB_B.TARGET_COL_P
    ,TAB_B.TARGET_COL_Q
    FROM TABLE_B TAB_B
    WHERE TAB_B.KEY_COL = TABLE_A.KEY_COL)
    WHERE EXISTS (SELECT 1
    FROM TABLE_B TAB_B
    WHERE TAB_B.KEY_COL = TABLE_A.KEY_COL);

    (3)
    UPDATE
    テーブル名1
    SET
    テーブル名1.列名1 = (
    SELECT
    テーブル名2.列名2
    WHERE
    テーブル名1.列名X = テーブル名2.列名X
    );

    ・エラーコードはJYP8399Eでした。

    A5:SQL Mk-2で何らかの制約等があったりするのかなと思い質問をさせていただいた次第です。
    拙い文面で申し訳ありません。

    #21177 返信
    松原正和
    キーマスター

    りさんこんにちは。

    A5:SQL Mk-2 は基本的に入力されたSQLをそのままサーバーに送信するだけなので、SQLに制限はありません。

    複数テーブルに基づく Oracle の UPDATE 文は FROM 句が使用できないので、(1) は NG です。
    (2) は SET 句の直後の ( の閉じ括弧がありません。

    以下のようなSQLになると思います。


    update TABLE1 A
    set (COLUMN2, COLUMN3) = (select COLUMN2, COLUMN3 from TABLE2 B where B.COLUMN1 = A.COLUMN1)
    where exists (select 1 from TABLE1 B where B.COLUMN1 = A.COLUMN1);

    ただ、エラーコード JYP8399E についてですが、これは Oracle Database のエラーではなく、Synfoware Server のエラーのようです。
     
    set (COLUMN2, COLUMN3) = ... という書き方は(おそらく)Oracle Database 独自の書き方なので、Synfoware Server ではエラーになるかもしれません。
     
    Synfoware Server は使ったことがないですが、上記のSQLでエラーになる場合、以下のようなSQLが使えるかもしれません。


    update TABLE1
    set
    COLUMN2 = (select COLUMN2 from TABLE2 B where B.COLUMN1 = TABLE1.COLUMN1)
    ,COLUMN3 = (select COLUMN3 from TABLE2 B where B.COLUMN1 = TABLE1.COLUMN1)
    where exists (select 1 from TABLE1 B where B.COLUMN1 = TABLE1.COLUMN1);

6件の投稿を表示中 - 1 - 6件目 (全6件中)
返信先: 別テーブルの値で更新をしたい
あなたの情報:




コメントは受け付けていません。