9

次のような Price という SQLite テーブルがあります。

date,     productId, price
----------------------
20120601, 10       , 10.1
20120601, 20       , 20.1
20120602, 10       , 0
20120602, 20       , 0
20120602, 30       , 0

テーブルは次のステートメントで作成されます。

CREATE TABLE "Price" ("date" INTEGER NOT NULL , "productId" INTEGER NOT NULL , "price" DOUBLE, PRIMARY KEY ("date", "productId"))

date==20120602 の価格を前日の同じ商品の価格で埋めたいです。

つまり、テーブルを次のようにしたい:

date,     productId, price
----------------------
20120601, 10       , 10.1
20120601, 20       , 20.1
20120602, 10       , 10.1
20120602, 20       , 20.1
20120602, 30       , 0

だから私はこのSQL文を試しました:

UPDATE Price New SET New.price = 
    (SELECT old.price FROM Price Old WHERE New.date == 2 AND Old.date == 1 AND New.productId == Old.productId)

しかし、SQLiteはドットの近くでエラーを出しました。

私がこのステートメントを試したよりも:

UPDATE New Set New.Price = Old.Price
FROM Price New, Price Old
WHRER ......

SQLite で FROM 付近でエラーが発生しました。

SQLite の SQL 構文を再確認しましたが、ラッキーではありませんでした。試したことはありませんが、両方のステートメントが MS SQL Server で期待どおりに機能すると思います。New と Old があまりにも異なるテーブルの場合、最初のステートメントは機能する可能性がありますが、同じテーブルにそれらが必要です。

C++ コードで 1 行を 1 回更新する for ループを書きたくないので、SQLite でこれを実現する正しい方法についてアドバイスが必要です。

ありがとうございました。

4

1 に答える 1

15

私自身もこれを経験しました。変更NewUPDATE Price、使用する場所で単語を削除するだけです。もっと良い解決策があると確信していますが、それは機能します。New.somethingPrice.something

コメントからのコードスニペットで更新...

UPDATE Price 
SET
price = (SELECT old.price FROM Price Old WHERE Old.date = 1 AND price.productId = Old.productId) 
WHERE price.date = 2
于 2012-05-27T08:39:40.127 に答える