我正在使用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查询中的子查询中引用外部表的属性?有没有什么方法可以重新构建我的查询以解决这个限制?
您不能在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)
| 归档时间: |
|
| 查看次数: |
2069 次 |
| 最近记录: |