UPDATE语句中表名的SQLite别名

时间:2012-05-27 08:24:21

标签: sqlite alias

我有一个名为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"))

我想用上一个日期的同一产品的价格填写日期== 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在dot附近给了我一个错误。

我试过这句话:

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

SQLite在FROM附近给了我一个错误。

我仔细检查了SQLite的SQL语法,但没有发现幸运。即使我从未尝试过,我认为这两个语句在MS SQL Server中都能正常工作。如果New和Old的表太不同,第一个语句可能会起作用,但我需要它们在同一个表中。

我真的不想写一个for循环来更新我的C ++代码中的一行,我需要在SQLite中以正确的方式获得建议。

谢谢。

1 个答案:

答案 0 :(得分:12)

我自己经历过这个。只需在New之后移除单词UPDATE Price,无论您使用New.something更改为Price.something。我确信有一个更好的解决方案,但它确实有效。

使用评论中的代码段进行了更新...

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