我在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
)
不幸的是,我似乎无法在SQLite的UPDATE语句中为表使用别名。查询失败(在Python中)" sqlite3.OperationalError:near" AS&#34 ;:语法错误",并且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
)
我尝试了其他一些变体,例如使用"> = 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
)
如何在UPDATE查询中的子查询中引用外部表的属性,SQLite将接受哪种语法?有什么方法可以重新构建我的查询来解决这个限制吗?
答案 0 :(得分:5)
您不能在UPDATE语句中更新的表上添加别名。
但是,您可以重命名子查询中的任何其他表,因此表名仍然是明确的:
UPDATE StopTimes
SET departure_time = NULL
WHERE NOT EXISTS
(
SELECT 1 FROM StopTimes AS B
WHERE B.stop_sequence > StopTimes.stop_sequence
)