2013-02-13 98 views
0

我试图通过添加一列并标记一些行来指示它们是每次旅程的最后一站来改进一个运输计划表。执行更新的SQLITE语法错误

每趟旅行都会有很多行显示行程中的行程和顺序。如果序列号是该行程中最高的,我想用'1'更新LastStop列。

我认为以下SQL在正确的轨道上,但我得到一个“没有这样的列:s1.stop_sequence”,所以我不知道如果我甚至在正确的轨道上,直到这不明显的我的错误已解决。我是一个几乎超越新手级别的SQL轻量级。 Stop_Sequence绝对是该列的正确名称。

UPDATE stop_times 
    SET LastStop = '1' 
WHERE stop_sequence =(
      SELECT max(st.stop_sequence) 
      FROM stop_times s1 
      WHERE s1.trip_id = trip_id 
     ) 
     AND 
     trip_id = s1.trip_id 
     AND 
     stop_ID = s1.stop_id; 

样本数据的简化版本如下。

TripID Stop Sequence LastStop 
665381 1766 1 
665381 3037 2 
665381 3038 3   1 
667475 1130 1 
667475 2504 2   1 
644501 2545 1 
644501 3068 2 
644501 2754 3 
644501 3069 4 
644501 2755 5   1 
+0

查询中和示例数据中的列名称不匹配。别名是's1'还是'st'? – 2013-02-13 08:13:05

回答

0

您不能从外部查询引用子查询中的列。 此外,过滤器trip_id = s1.trip_id已复制,并且您不希望在stop_id上过滤,因为这会阻止MAX查看此行的任何其他停靠站。

试试这个:

UPDATE stop_times 
SET LastStop = '1' 
WHERE Stop_Sequence = (SELECT MAX(Stop_Sequence) 
         FROM stop_times s1 
         WHERE s1.Trip_ID = stop_times.Trip_ID) 

另外,最后一站是没有其他站与同一行程较大的序列号存在一个站:

UPDATE stop_times 
SET LastStop = '1' 
WHERE NOT EXISTS (SELECT 1 
        FROM Stop_Sequence s1 
        WHERE s1.Trip_ID = stop_times.Trip_ID 
        AND s1.Stop_Sequence > stop_times.Stop_Sequence) 
0

这会为你工作的,只要停止字段始终是小于1000(使用更大的乘数如果它是):

UPDATE stop_times 
SET laststop = 1 
WHERE tripid*1000+sequence IN (
    SELECT tripid*1000+sequence FROM (
     SELECT tripid, max(sequence) AS sequence 
     FROM stop_times 
     GROUP BY 1 
    ) 
) 

我WOU LD写这使用元组的语法,但SQLite不支持它:

UPDATE stop_times 
SET laststop = 1 
WHERE (tripid, sequence) IN (
    SELECT (tripid, sequence) FROM (
     SELECT tripid, max(sequence) AS sequence 
     FROM stop_times 
     GROUP BY 1 
    ) 
) 

对不起,没有SQLFiddle - 它似乎并没有今天为我工作。