ホーム › フォーラム › A5:SQL Mk-2掲示板 › 別テーブルの値で更新をしたい
-
投稿者投稿
-
り
ゲストテーブルA内のカラムに対してテーブルB内のカラムの値で更新するためにUPDATE文を使いたいのですが、なかなかうまくいきません。
ネットで調べながらUPDATE JOINやサブクエリを使うやり方を試してはいますが、エラーが消えず困っています。何かいい方法はないのでしょうか?り
ゲスト【追記】
エラー内容はいずれも「キーワード”SET”が指定されていません」と出てきました。せみ
ゲストりさん
よそ者がでしゃばるのも恐縮ですが、ここはA5:SQL Mk-2掲示板ですので、SQLの文法等に関する質問は他でされた方がより的確なアドバイスをもらえると思います。
ポイントとしては
・SQL文がないです(最も肝心です)
・なんのDBを使っているのか?
・エラー内容にエラーコードはありませんか?
・各所にあるサンプルのSQLを、何も変えずに実行して成功するかどうか?
・自分のSQLと比べて異なる箇所を探す
です。松原正和
キーマスターりさん、せみさんこんにちは。
はい、別テーブルと結合してのUPDATEはSQL標準ではないので各DB製品ごとに構文は異なります。(対応しないDB製品もあります。)
週末くらいしか掲示板の書き込みができず、返信が遅くなってはしまいますが、それでもよろしければ多少お教えできるかもしれません。りさんの使用するDB製品は何でしょうか?り
ゲストお忙しい中返信ありがとうございます。
・製品は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で何らかの制約等があったりするのかなと思い質問をさせていただいた次第です。
拙い文面で申し訳ありません。松原正和
キーマスターりさんこんにちは。
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);
-
投稿者投稿