使用下一行sqlite中的值更新行

时间:2016-10-26 21:51:46

标签: sqlite

我在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;

1 个答案:

答案 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正在寻找第一个数据源(从内部到外部)在定义此列的查询层次结构中。