我在SQLite DB中有以下列。
id,ts,origin,product,bid,ask,nextts 1,2016-10-18 20:20:54.733,SourceA,Dow,1.09812,1.0982, 2,2016-10-18 20:20:55.093,SourceB,Oil,7010.5,7011.5, 3,2016-10-18 20:20:55.149,SourceA,Dow,18159.0,18161.0,
如何填写下一个时间戳'列(nextts)具有来自同一来源的同一产品(ts)的下一个时间戳?我一直在尝试以下方法,但我似乎无法将子查询放在UPDATE语句中。
UPDATE TEST a SET nextts = (select ts
from TEST b
where b.id> a.id and a.origin = b.origin and a.product = b.product
order by id asc limit 1);
如果我打电话给我,我可以显示它,但我还没有找到更新价值的方法。
select a.*,
(select ts
from TEST b
where b.id> a.id and a.origin = b.origin and a.product = b.product
order by id asc limit 1) as nextts
from TEST a
order by origin, a.id;
答案 0 :(得分:1)
问题是您在UPDATE
语句中使用表别名,这是不允许的。你可以从那里跳过别名,并使用unaliased(但是表名前缀)引用它的列(同时保留SELECT
的别名引用),如下所示:
UPDATE TEST
SET nextts = (
SELECT b.ts
FROM TEST b
WHERE b.id > TEST.id AND
TEST.origin = b.origin AND
TEST.product = b.product
ORDER BY b.id ASC
LIMIT 1
);
SQLite必须使用表名对前缀不带变化的列引用进行前缀,以确定您是否引用了非混淆表。否则,id
列应该被理解为距离最近的[*]可能数据源的id
,在这种情况下,它是别名表(作为b
别名),而我们对unaliased表感兴趣,因此我们需要明确地告诉SQLite。
[*]最近的数据源是在同一查询,父查询或父查询等中列出的数据源.SQLite正在寻找第一个数据源(从内部到外部)在定义此列的查询层次结构中。