执行更新的SQLITE语法错误

时间:2013-02-13 04:07:42

标签: 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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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
    )
)

我会用tuple语法编写这个,但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 - 它似乎今天对我不起作用。