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

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

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

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

SQL

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

Q&A

解決済

2回答

6673閲覧

ふたつのテーブルをひとつにまとめたい!

hacosato

総合スコア48

SQLite

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

SQL

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

0グッド

1クリップ

投稿2019/01/14 12:36

SQLiteでデータベースの勉強中です!

テーブルがふたつあって、それをIDを基準にしてまとめたいです。

↓テーブルA(こちらが親)

IDitemprice
1りんご300
2いちご
3バナナ100
4みかん

↓テーブルB(こちらが子ども)

IDprice
2200
3150

↓ほしいかたち

IDitemprice
1りんご300
2いちご200
3バナナ150
4みかん

IDを基準にして、Bにある情報をAにまとめてしまいたい、というような感じです。
BのテーブルにあってAのテーブルにないようなIDはありません。
また、Bのpriceが正しいことがわかっているので、かぶるところがあったら上書きしたいです。

調べてみたところ、情報を更新するには UPDATEJOIN を使えばいいようだと思っています。

https://www.dbonline.jp/sqlite/insert/index5.html

↑これをもとにして、条件のところに別のテーブルを使えたらいいかなと思っていますが、そのSQL文を教えていただけませんでしょうか…。

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

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

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

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

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

firedfly

2019/01/14 13:08 編集

こんにちは ・AとBをjoinした結果を表示したい ・AのpriceをBのpriceで更新(update)したい どちらでしょうか。 また、レコードによってAにpriceが入っているけれどBに入っていないことはあるでしょうか。
hacosato

2019/01/14 13:11

ご質問ありがとうございます! > どちらでしょうか。 後者です! UPDATEしたいです! > レコードによってAにpriceが入っているけれどBに入っていないことはあるでしょうか。 あります! 例のID=1がそうなってます! Aのテーブルの情報が虫食いだらけでしかも信用できない中、 情報量は少ないけど確実なBのテーブルが入荷したぞ!という状況で、 すべての情報をAにまとめたい、というような感じです。 どうぞよろしくお願いします。
firedfly

2019/01/14 13:13

なるほど。 Bにレコードがあれば、必ず正しいpriceが入っているということですね。
hacosato

2019/01/15 14:51

大変遅くなりすみません! それで合ってます!!
guest

回答2

0

coalesce()を使用して、更新前の値を保持しながら、というのもありだと思います。

SQL

1select a.*, coalesce(b.price, a.price) as Latest_price 2from A LEFT JOIN B ON A.id = B.id

更新するなら、firedifyさんの方が効率はいいですけど、以下の様な方法もあります。

SQL

1UPDATE A 2SET price = coalesce((SELECT price FROM B WHERE id=A.id), price)

投稿2019/01/15 00:40

sazi

総合スコア25173

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

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

hacosato

2019/01/15 15:04

ご回答ありがとうございました! たしかに動いたのですが、りくつがどうもよくわからなかったです…。 coalesceをもっと時間かけてじっくりさわってみます〜。
guest

0

ベストアンサー

こんにちは。
Bの内容でAをUPDATEしたいということで、他のDBでは次のSQLになります。

SQL

1UPDATE A 2LEFT JOIN B ON A.id = B.id 3SET price = B.price

が、残念ながらSQLiteではUPDATEとJOINを同時に使うことはできません。
サブクエリでがんばりましょう。

SQL

1UPDATE A 2SET price = (SELECT price FROM B WHERE id = A.id) 3WHERE EXISTS (SELECT price FROM B WHERE id = A.id)

投稿2019/01/14 13:27

編集2019/01/15 15:07
firedfly

総合スコア1131

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

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

hacosato

2019/01/15 14:54

ありがとうございました! お返事大変遅くなってしまいすみません…。 ご提示いただいたのを少し変えて、以下のようにしたら動きました〜。 UPDATE A SET price = (SELECT price FROM B WHERE ID = A.ID) WHERE EXISTS (SELECT price FROM B WHERE ID = A.ID); SETの直後のカラムの名前にはテーブルの名前いらないみたいでした…。どうして…。 よく読み返してみたら意味がわからないところはとくになかったので、 これイディオムとして口からスラスラ出るようにしたいと思います!
firedfly

2019/01/15 15:09

おっと失礼、修正しておきました。 サブクエリを使えるとだいたいの作業はできます。
hacosato

2019/01/15 15:10

ありがとうございます! がんばります!
hacosato

2019/02/17 08:20

古い回答にすみません。 先日はありがとうございました! その後、自分で試してみたところ、 UPDATE A SET price = (SELECT price FROM B WHERE id = A.id) WHERE id = A.id; という短い文で、やりたいことができている感じがしました。 EXISTSという部分はないとどういった弊害があるのでしょうか?
firedfly

2019/02/17 14:14

こんにちは。 UPDATE A SET price = (SELECT price FROM B WHERE id = A.id) 絞り込む必要なければWhere句は省いていいですが、 Bに対応するidがなかった場合にpriceにNULLが入ってしまわないでしょうか。
hacosato

2019/02/19 15:05

firedflyさま お返事ありがとうございます! > Bに対応するidがなかった場合にpriceにNULLが入ってしまわないでしょうか。 おっしゃる通りでした???? EXISTSの必要性が理解できました…どうもありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問