6

我正在使用 SQLite 数据库中的 GTFS 数据。我有一个 StopTimes 表,其中包含trip_id、stop_sequence 和department_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": syntax error”,并且 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
)

如何使用 SQLite 接受的语法在 UPDATE 查询的子查询中引用外部表的属性?有什么方法可以重新制定我的查询来绕过这个限制吗?

4

1 回答 1

6

您不能在 UPDATE 语句中更新的表上放置别名。

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

UPDATE StopTimes
SET departure_time = NULL
WHERE NOT EXISTS
(
    SELECT 1 FROM StopTimes AS B
    WHERE B.stop_sequence > StopTimes.stop_sequence
)
于 2014-05-12T17:32:27.320 回答