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

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

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

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

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

Q&A

解決済

2回答

590閲覧

変更情報のみのレコードを、同じテーブルの有効な最新値で更新したい

TMREWSync

総合スコア9

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

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

0グッド

1クリップ

投稿2023/01/30 06:12

編集2023/01/31 16:02

前提

CSVで公開されているデータをSQLiteでデータベース化を行っています。
CSVは基本となる全データとそれからの差分データが公開されており、それを結合して変更履歴付のテーブルを作成しようとしています。
CSVの仕様はあるのですが、一部仕様と異なる形式で公開されており具体的には次のように変更箇所のみ値が入力されています。

基本データ例(実際は35カラム)

ID商品種別商品名単価変更日
11ガム802022/04/01
21チョコ1002022/04/01
32アイス1202022/04/01

変更データ例1(全170ファイル)

ID商品種別商品名単価変更日
21202022/06/01
3アイスクリーム 2022/06/01

変更データ例2

ID商品種別商品名単価変更日
31502022/08/01
43お茶1202022/08/01

実現したいこと

CSVを読み込んで次のようにテーブル化まで行いました。

結合結果

ID商品種別商品名単価変更日
11ガム802022/04/01
21チョコ1002022/04/01
2NULLNULL1202022/06/01
32アイス1202022/04/01
3NULLアイスクリームNULL2022/06/01
3NULLNULL1802022/08/01
43お茶1202022/08/01

これをSQLを使用してそれぞれの値がNULLであった場合、最終の有効な値を引き継ぐように更新処理をすることは可能でしょうか。
結合後ではなく変更データを一度テーブルにしてINSERTする際にNULLであれば基本データから値を取得するほうが良いのでしょうか。

ID商品種別商品名単価変更日
11ガム802022/04/01
21チョコ1002022/04/01
21チョコ1202022/06/01
32アイス1202022/04/01
32アイスクリーム1202022/06/01
32アイスクリーム1802022/08/01
43お茶1202022/08/01

よろしくお願いいたします。

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

SQLite Version 3.27.2

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

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

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

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

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

guest

回答2

0

タイトルと異なる方法となりましたが、回答いただいた内容からCOALESCEを使用して変更テーブル側を一度SELECTしてから基本テーブルへINSERTする方法で行っていこうと思います。
まだ最新の変更日の物を取得するようにはできていませんが次のようなSQLです。

INSERT INTO 基本テーブル( ID, 商品種別, 商品名, 単価, 変更日 ) SELECT CHANGETABLE.ID, COALESCE(CHANGETABLE.商品種別, BASETABLE.商品種別) AS 商品種別, COALESCE(CHANGETABLE.商品名, BASETABLE.商品名) AS 商品名, COALESCE(CHANGETABLE.単価, BASETABLE.単価) AS 単価, CHANGETABLE.変更日 FROM 変更テーブル1 AS CHANGETABLE LEFT JOIN 基本テーブル AS BASETABLE ON CHANGETABLE.ID= BASETABLE.ID;

投稿2023/01/31 07:02

TMREWSync

総合スコア9

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

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

0

ベストアンサー

たとえば以下のようなUPDATE文はどうでしょうか。

SQL

1UPDATE TBL 2SET 商品種別 = COALESCE(商品種別, (SELECT 商品種別 FROM TBL AS X WHERE TBL.ID = X.ID AND TBL.変更日 > X.変更日 AND 商品種別 IS NOT NULL ORDER BY 変更日 DESC LIMIT 1)), 3 商品名 = COALESCE(商品名, (SELECT 商品名 FROM TBL AS X WHERE TBL.ID = X.ID AND TBL.変更日 > X.変更日 AND 商品名 IS NOT NULL ORDER BY 変更日 DESC LIMIT 1)), 4 単価 = COALESCE(単価, (SELECT 単価 FROM TBL AS X WHERE TBL.ID = X.ID AND TBL.変更日 > X.変更日 AND 単価 IS NOT NULL ORDER BY 変更日 DESC LIMIT 1))

PKなどの情報があればもう少しスマートなSQLで実現できるかもしれません。

投稿2023/01/30 09:35

neko_the_shadow

総合スコア2225

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

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

TMREWSync

2023/01/31 03:48

回答ありがとうございます。 UPDATE文を実行してみておりますが、NULLになる可能性のあるカラムが32カラムあり、レコード数も25万ほどあるためか3時間経過しても処理が終わりません。 キーに関してはIDと変更日としております。 ご提案いただいたSQLを参考に変更データのNULL部分を基本データからCOALESCEを使用してSELECT、それを基本データにINSERTできないか試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問