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

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

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

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

SQL

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

Q&A

解決済

2回答

10270閲覧

Error near "FROM": syntax error が発生します

退会済みユーザー

退会済みユーザー

総合スコア0

SQLite

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

SQL

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

0グッド

1クリップ

投稿2020/05/21 15:03

編集2020/05/22 02:09

SQLiteのテーブル2つをつないで、一方の「最大値+1」をもう一方に書き込もうとしています。

テーブル contract

  • id
  • status 契約状況 1以外が対象
  • count => bill.bill_countの最大数+1を入力しようとしています

テーブル bill 

  • id
  • contract_id
  • bill_count => 0,1,2,3,4,5,6 と支払回数が格納されています

アップデートのため下記のようなSQLを書きました

SQLite

1UPDATE c 2SET count = MAX(b.bill_count)+1 3FROM contract AS c 4LEFT JOIN bill AS b 5ON c.id = b.contract_id 6WHERE c.status <> '1' 7GROUP BY b.contract_id

しかし、実行すると「Error near "FROM": syntax error」が発生してしまいます。

selectによる表示は目的通り出力されます

SQLite

1SELECT c.*,MAX(b.bill_count)+1 2FROM contract as c 3LEFT JOIN bill as b 4ON c.id = b.contract_id 5WHERE c.status <> '1' 6GROUP BY b.contract_id

FROM周辺に問題があるようなのですが、どのように修正すればよいか分からずにいます。
よろしくおねがいします。

==追記(他に試した方法)==

SQLite

1/* 同じデータで埋められてしまいます */ 2UPDATE contract 3SET count = ( 4 SELECT MAX(b.bill_count)+1 5 FROM contract as c 6 LEFT JOIN bill as b 7 ON c.id = b.contract_id 8 WHERE c.status <> '1' 9 GROUP BY b.contract_id 10)

SQLite

1/* 応答がなくなり、ハングアップ状態 */ 2UPDATE contract 3SET count = ( 4 SELECT MAX(b.bill_count)+1 5 FROM contract as c 6 LEFT JOIN bill as b 7 ON c.id = b.contract_id 8 WHERE contract.id = b.contract_id 9 GROUP BY b.contract_id 10)

SQLite

1/* Error no such column: b.contract_id */ 2UPDATE contract 3SET count = 4( 5 SELECT MAX(b.bill_count)+1 6 FROM bill as b 7 GROUP BY b.contract_id 8) 9WHERE id = b.contract_id 10/* b.contract_id を bill.contract_id にするとエラーは bill.contract_id */

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

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

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

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

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

guest

回答2

0

ベストアンサー

回答いただいた内容をヒントに下記のようにするとうまくいきました
応答に時間がかかりハングアップしたのかと思いましたが、
そのまま放置していたら、予定の結果を得ることができました。

SQLite

1UPDATE contract 2SET count = ( 3 SELECT MAX(b.bill_count)+1 4 FROM bill as b 5 WHERE contract.id = b.contract_id 6) 7WHERE status <> '1'

投稿2020/05/22 02:13

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

UPDATE ... FROM という構文がおかしいと言われているのでは。
UPDATE

SELECTで結果が取れているなら

SQL

1UPDATE contract 2SET count = ( 3 SELECT MAX(b.bill_count)+1 4 FROM contract as c 5 LEFT JOIN bill as b 6 ON c.id = b.contract_id 7 WHERE c.status <> '1' 8 GROUP BY b.contract_id 9)

みたいな感じでどうでしょう。
試してないのでAS句の位置とか間違っているかも。

投稿2020/05/21 17:37

javahack

総合スコア1088

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

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

退会済みユーザー

退会済みユーザー

2020/05/22 00:15

ありがとうございます このような書き方は知りませんでした。 試してみましたが、全て同じ数値が代入されました。 エラーは発生していません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問