質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

8604閲覧

Oracle sql 2つのテーブルに同じ値があった場合のアップデートについて 

takuyaf

総合スコア10

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/09/26 11:30

###前提・実現したいこと

sqlのアップデート処理で TBJIP19CとTBJIP05Gの二つのテーブルに同じ値があった場合 TBJIP19Cの値を書き換える

###発生している問題・エラーメッセージ

SQL : ORA-00933: SQLコマンドが正しく終了されていません。

###該当のソースコード

Oracle
UPDATE TBJIP19C SET TBJIP19C.SU_KANPAN = '100' , TBJIP19C.KI_RKSYARYO = '200' FROM TBJIP19C LEFT JOIN TBJIP05G ON TBJIP05G.DD_NENTUKI = TBJIP19C.DD_NENTUKI AND TBJIP05G.CD_SYAIN = TBJIP19C.CD_SYAIN AND TBJIP05G.CD_KAISYA = TBJIP19C.CD_KAISYA

###試したこと

leftjoin等やってみましたが同じエラーが出てしまいます

###補足情報(言語/FW/ツール等のバージョンなど)

sql実行をしているのはA5:sql ver2.10.1 DD_NENTUKIのデータ型はCHR(6) CD_SYAIN のデータ型はCHR(6) CD_KAISYA のデータ型はCHR(2)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

回答はPanzer_vorさんを見ていただくとして、質問する前にマニュアルくらい確認して欲しいものです。
SQL言語リファレンス UPDATE構文
SQLを実行できるに足るCREATE TABLE, CREATE INDEX も載せるべきです。
ヘボン式ローマ字表 を使わないのも最近では珍しいですね。

投稿2016/09/26 14:49

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takuyaf

2016/09/27 00:35

アドバイスありがとうございます。 CREATE TABLE, CREATE INDEXについては考えがそこまで及んでおりませんでした。 次回からは用意するようにしておきます。 ヘボン式ローマ字表については現行のDBがこの形だったので、変更せずに行いました。
guest

0

ベストアンサー

OracleではUPDATE文のFROM句は利用できません。

UPDATE文でのFROM句は、
SQL ServerやPostgreSQLなどのベンダ拡張となります。

といってもOracleで同じようなことができないわけでもなく、
確かUPDATE〜SET句の間でサブクエリを記述すると同様なことが出来た記憶があります。

ですが、そもそも更新値に別テーブルの値を設定するのでなければ、
WHERE条件のEXISTS句を用いて実現できるのではないでしょうか?

SQL

1UPDATE TBJIP19C t1 2SET 3 SU_KANPAN = '100' 4, KI_RKSYARYO = '200' 5WHERE 6 EXISTS( 7 SELECT 8 * 9 FROM 10 TBJIP05G t2 11 WHERE 12 t1.DD_NENTUKI = t2.DD_NENTUKI 13 AND t1.CD_SYAIN = t2.CD_SYAIN 14 AND t1.CD_KAISYA = t2.CD_KAISYA 15 )

#追記
UPDATE〜SET内のサブクエリに触れたので、
サブクエリを利用する場合のサンプルも記載します。

下記例はテーブル1とテーブル2のidが一致する、
テーブル1のnameをテーブル2のnameで上書きする処理です。
(テーブルはどちらもid、nameを持つとします)

SQL

1UPDATE ( 2 SELECT 3 t1.name AS name1 4 , t2.name AS name2 5 FROM 6 table1 t1 7 INNER JOIN table2 t2 8 ON t1.id = t2.id 9) 10SET 11 name1 = name2

投稿2016/09/26 13:44

編集2016/09/26 14:04
Panzer_vor

総合スコア1636

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takuyaf

2016/09/27 00:39

詳しい解説と複数の実行方法をお教えくださりありがとうございます。 WHERE条件のEXISTS句の設定をすることで希望通りの操作を行う事が出来ました。 まだまだSQLに慣れていないのでいろいろ試していこうと思います。
Panzer_vor

2016/09/27 10:14

> takuyafさん 問題が解決されたようで何よりです^^ Orlofskyさんもおっしゃっておりますが、 DBMSのベンダごとに記載方法が異なるなどがあるため、 なるべくマニュアルを見るようにすると良いと思います。 (特に別テーブルを参照するUPDATE文は割とバラついているので・・・^^;)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問