具有条件的相关子查询的SQLite更新语法

Imp*_*Dev 6 sql sqlite gtfs

我正在使用SQLite数据库中的GTFS数据.我有一个StopTimes表,其中包含trip_id,stop_sequence和departure_time(以及其他)列.我想为每次旅行取消最后一次出发时间(在具有最大stop_sequence的元组中).

我能想到的最明显的方法就是这个查询:

UPDATE StopTimes AS A
SET departure_time = NULL
WHERE NOT EXISTS
(
    SELECT * FROM StopTimes B
    WHERE B.stop_sequence > A.stop_sequence
)
Run Code Online (Sandbox Code Playgroud)

不幸的是,看起来我不能在SQLite的UPDATE语句中为表使用别名.查询失败(在Python中)"sqlite3.OperationalError:near"AS":语法错误",SQLite中也不允许使用其他样式:

UPDATE A
SET departure_time = NULL
FROM StopTimes AS A
WHERE NOT EXISTS
(
    SELECT * FROM StopTimes B
    WHERE B.stop_sequence > A.stop_sequence
)
Run Code Online (Sandbox Code Playgroud)

我尝试了其他一些变体,例如使用"> = ALL(SELECT stop_sequence ... WHERE trip_id =?...)",但我无法填写该问号.

我也试过这个,但看起来这不是有效的SQL:

UPDATE StopTimes
SET departure_time = NULL
WHERE (trip_id, stop_sequence) IN
(
    SELECT trip_id, MAX(stop_sequence)
    FROM StopTimes
    GROUP BY trip_id
)
Run Code Online (Sandbox Code Playgroud)

如何使用SQLite将接受的语法在UPDATE查询中的子查询中引用外部表的属性?有没有什么方法可以重新构建我的查询以解决这个限制?

CL.*_*CL. 6

您不能在UPDATE语句中更新的表上添加别名.

但是,您可以重命名子查询中的任何其他表,因此表名仍将是明确的:

UPDATE StopTimes
SET departure_time = NULL
WHERE NOT EXISTS
(
    SELECT 1 FROM StopTimes AS B
    WHERE B.stop_sequence > StopTimes.stop_sequence
)
Run Code Online (Sandbox Code Playgroud)