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

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

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

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

SQL

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

Q&A

解決済

4回答

1619閲覧

結合結果でのUPDATE文

yamaguti

総合スコア185

Oracle

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

SQL

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

0グッド

0クリップ

投稿2017/08/23 11:04

お世話になっております。

結合した結果でデータにupdateをかけたいのですが
単一行副問合せに2つ以上の行が戻されますとでてしまいます。
クエリの問題をご指摘頂けますでしょうか。

値引前の価格に値引き価格が誤って入ってしまったので
商品の履歴テーブルを元に戻したいです。

sql

1UPDATE 商品テーブル 2SET 3 値引前価格 = 4 ( 5 SELECT 6 商品履歴.定価 7 FROM 8 商品履歴 9 LEFT JOIN 商品テーブル 10 ON 商品テーブル.商品コード = 商品履歴.商品コード) 11

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

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

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

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

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

SVC34

2017/08/23 15:17

1つの商品コードに対して商品履歴テーブルのレコードが複数存在する場合、定価はそれぞれ異なる可能性はありますでしょうか。異なる場合、最新の定価に戻せばよいのでしょうか。日付や連番等、最新の定価を特定する方法はありますか。
yamaguti

2017/08/23 15:41

商品テーブルの商品に対して履歴は一つになります。LASTING_FLGを持っています。なので最新定価が分かります。よろしくお願いします。
SVC34

2017/08/23 23:04

履歴がひとつだけであれば、もともとエラーは発生しないはずです
guest

回答4

0

商品テーブルの商品に対して履歴は一つという言葉の意味が、
質問者と回答者で食い違っている気がします。

回答者は条件に商品コードだけを指定して商品履歴テーブルを検索したら1レコードしか返らない前提で話をしています。それにたいして質問者のコメントにこのような文言がついています。

yamaguti
2017/08/24 00:41
商品テーブルの商品に対して履歴は一つになります。LASTING_FLGを持っています。なので最新定価が分かります。よろしくお願いします。

条件に商品コードだけを指定して商品履歴テーブルを検索したらLASTING_FLGが立っている物が1レコード、立っていないものが(0..n)レコードあるのではないでしょうか。

LASTING_FLGの詳細が明らかになっていませんが、商品履歴の抽出条件に「WHERE LASTING_FLG = 最新フラグの値」 を追加するだけで今までの回答が生きてくるのではないかと予想しています。

投稿2017/08/24 01:24

kopio

総合スコア487

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

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

0

ベストアンサー

whereで絞らないと変更対象が全件になると思い作成してみました

sql

1UPDATE 商品テーブル S 2SET 3 値引前価格 = 4 ( SELECT 5 R.定価 6 FROM 7 商品履歴 R 8 LEFT JOIN 商品テーブル S1 9 ON S1.商品コード = R.商品コード 10 ) 11WHERE EXISTS (SELECT 'x' FROM 商品履歴 R1 WHERE R1.商品コード = S.商品コード) 12;

投稿2017/08/24 00:45

A.Ichi

総合スコア4070

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

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

0

oracleの文法とはあわないかもしれませんが、MySQLで処理するとこう

SQL

1create table shohin(code int unique key,teika int,nebikimae int null); 2insert into shohin(code,teika) values(1,1000),(2,1500),(3,800); 3create table rireki(id int unique key auto_increment,code int,teika int); 4insert into rireki(code,teika) values(1,1000),(1,2000),(1,3000),(2,1500),(2,1500),(2,1000),(3,800); 5

更新

SQL

1update shohin as t1, 2(select code,teika from rireki as t2 where exists( 3select code,max(id) as max_id from rireki as t3 group by code 4having max_id=t2.id)) as t4 5set t1.nebikimae=t4.teika where t1.code=t4.code 6

投稿2017/08/24 00:44

yambejp

総合スコア114572

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

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

0

編集しました。
以下ではどうでしょうか。

SQL

1UPDATE 2( 3 SELECT 4 商品テーブル.値引前価格, 商品履歴.定価 5 FROM 6 商品履歴 7 LEFT JOIN 商品テーブル 8 ON 商品テーブル.商品コード = 商品履歴.商品コード 9) 10SET 11 値引前価格 = 定価;

投稿2017/08/23 11:15

編集2017/08/23 13:21
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yamaguti

2017/08/23 12:57

ありがとうございます。 補正対象データ400件程なのですが、商品テーブルの12万件のレコードが更新されてしまいます。
退会済みユーザー

退会済みユーザー

2017/08/23 13:20

回答を編集しました。 商品履歴テーブルにあるのが400行である、という認識で修正しています。
退会済みユーザー

退会済みユーザー

2017/08/23 13:57

ご質問のSQLでエラーとなるのは、更新対象の商品テーブルに対して、 指定のサブクエリでは行を特定する情報が得られないため複数行が返却されるためかと思います。
yamaguti

2017/08/23 15:43

ありがとうございます。 商品履歴に400件の認識で間違いございません。 SET句を結合後にもってくるとエラーになってしまいました。 「SETキーワードがありません」とメッセージがでます。
yamaguti

2017/08/23 15:49

ごめんなさい。間違えてました。 キー保存されていない表にマップする列は変更できませんというエラーです
退会済みユーザー

退会済みユーザー

2017/08/23 21:22

では、LEFT JOINとなっている箇所をINNER JOINで実行してみて頂けませんか。
退会済みユーザー

退会済みユーザー

2017/08/23 21:56

ORA-01779が発生しているのであれば、上記ではダメかもしれません。 同じ商品が複数回履歴に含まれるのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問