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

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

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

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

Q&A

解決済

3回答

507閲覧

最新日でのupdate文

yamaguti

総合スコア185

SQL

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

0グッド

1クリップ

投稿2017/09/04 11:04

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

データ補正の為、最新価格テーブルから、商品マスタの最新価格テーブルにupdateする必要があります。

最新価格テーブルには、同じ商品IDが入っている場合があります。どの商品も最新日を対象にUPDATEしたい場合は
どのようにSQLを記載すればいいでしょうか。

最新価格テーブル
商品ID
KAITEI_DATE
KAKAKU

商品マスターテーブル
商品ID
商品cd
KAKAKU


SQL

1UPDATE 商品マスターテーブル 2SET KAKAKU = 3(SEKECT KAKAKU FROM 最新価格テーブル 4LEFT JOIN 商品マスターテーブル 5ON 最新価格テーブル.商品ID = 商品マスターテーブル.商品ID)

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

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

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

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

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

guest

回答3

0

ベストアンサー

こちら(結合結果でのUPDATE文)で更新元のテーブルを間違えちゃったってことですかね?

UPDATEは、DBMSによってかなり記述方法が変ります。
(質問内容に限らず)どのDBMSなのかはタグなどで明記するよう心掛けましょう。

過去の質問からoracleだと想定します。
全件を対象にするなら、相関問い合わせより結合の方が効率は良さそうなので、

SQL

1update ( 2 select mst.kakaku, np.kakaku as newprice 3 from 商品マスターテーブル as mst 4 inner join ( 5 select *, lead(KAITEI_DATE) over(partition by 商品ID order by KAITEI_DATE) as NEXT_KAITEI_DATE 6 from 最新価格テーブル 7 ) as np 8 on mst.商品ID=np.商品ID and np.NEXT_KAITEI_DATE is null 9) 10set kakaku=newprice

但し、気になる点として、価格改定日が予定日のものが無いかどうかです。
この場合に最新で更新してしまうと、改定日が到来していないものまで更新することになります。
気付かずにやっちゃうと、また補正が必要になります。

投稿2017/09/04 16:07

sazi

総合スコア25138

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

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

yamaguti

2017/09/05 01:29

回答ありがとうございます。 そうです。それで補正が必要になりました。 DBはOracleです。 クエリためさせて頂きます。
guest

0

  • 商品IDごとの最新の改訂日を得る (p2)
  • 最新価格テーブル (p1) とp2を結合し、商品IDごとの最新の価格を得る (p)
  • 商品マスターとpを結合し、pの最新価格を商品マスターの価格にSETする

sql

1UPDATE `商品マスター` AS mt 2 INNER JOIN ( 3 SELECT p1.`商品ID`, p1.`KAKAKU` 4 FROM `最新価格` AS p1 5 INNER JOIN ( 6 SELECT `商品ID`, MAX(`KAITEI_DATE`) AS `MAX_DATE` 7 FROM `最新価格` 8 GROUP BY `商品ID` 9 ) AS p2 10 ON p1.`商品ID` = p2.`商品ID` 11 AND p1.`KAITEI_DATE` = p2.`MAX_DATE` 12 ) AS p 13 ON mt.`商品ID` = p.`商品ID` 14 SET mt.`KAKAKU` = p.`KAKAKU` 15;

投稿2017/09/04 13:03

SVC34

総合スコア1149

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

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

yamaguti

2017/09/05 01:30

ありがとう御座います。確認させて頂きます。
guest

0

mysqlでの更新です。

sql

1UPDATE `商品マスター` t1, 2(SELECT `商品ID`, `KAKAKU` FROM `最新価格` JOIN 3 (SELECT `商品ID`, MAX(`KAITEI_DATE`) `KAITEI_DATE` FROM `最新価格`) t2 4 USING (商品ID,`KAITEI_DATE`) 5) t3 6SET t1.`KAKAKU` = t3.`KAKAKU` 7WHERE t1.`商品ID` = t3.`商品ID` 8;

postgres

sql

1UPDATE 商品マスター t1 SET KAKAKU=t3.KAKAKU 2FROM (SELECT 商品ID, KAKAKU FROM 最新価格 JOIN 3 (SELECT 商品ID, MAX(KAITEI_DATE) KAITEI_DATE FROM 最新価格 GROUP BY 1) t2 4 USING (商品ID,KAITEI_DATE) 5) t3 6WHERE t1.商品ID=t3.商品ID;

Oracle

sql

1update 商品マスター t1 2 set KAKAKU = ( 3 SELECT KAKAKU FROM 最新価格 t3 JOIN 4 (SELECT 商品ID, MAX(KAITEI_DATE) KAITEI_DATE FROM 最新価格 GROUP BY 商品ID ) t2 5 ON t2.商品ID=t3.商品ID and t2.KAITEI_DATE=t3.KAITEI_DATE and t3.商品ID = t1.商品ID) 6where exists 7 (SELECT 1 FROM 最新価格 t4 Where t4.商品ID = t1.商品ID) 8;

投稿2017/09/04 11:45

編集2017/09/05 02:22
A.Ichi

総合スコア4070

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

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

yamaguti

2017/09/05 01:30

ありがとう御座います。参考にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問