【问题标题】:Postgresql inserts values falselyPostgresql 错误地插入值
【发布时间】:2017-05-16 21:13:23
【问题描述】:

我想为 gtfs-feed 的一些数据添加一个非规范化表。为此,我创建了一个新表:

CREATE TABLE denormalized_trips (
  stops_coords json NOT NULL,
  stops_object json NOT NULL,
  agency_key text NOT NULL,
  trip_id text NOT NULL,
  route_id text NOT NULL,
  service_id text NOT NULL,
  shape_id text,
  route_color text,
  route_long_name text,
  route_desc text,
  direction_id text
);

CREATE INDEX denormalized_trips_index ON denormalized_trips (agency_key, trip_id);
CREATE UNIQUE INDEX denormalized_trips_index ON denormalized_trips (agency_key, route_id);

现在我想通过插入语句将数据从一个表传输到另一个表。语句比较复杂。

INSERT INTO denormalized_trips
SELECT
    trps.stops_coords,
    trps.stops_object,
    trps.trip_id,
    trps.service_id,
    trps.route_id,
    trps.direction_id,
    trps.agency_key,
    trps.shape_id,
    trps.route_color,
    trps.route_long_name,
    trps.route_desc
FROM (
SELECT
    array_to_json(ARRAY_AGG(array[stop_lat, stop_lon])) AS stops_coords,
    array_to_json(ARRAY_AGG(array[
            stops.stop_id,
            CAST ( stop_times.stop_sequence AS TEXT ),
            stops.stop_name,
            stop_times.departure_time,
            CAST ( stop_times.departure_time_seconds AS TEXT ),
            stop_times.arrival_time,
            CAST ( stop_times.arrival_time_seconds AS TEXT )
        ])) AS stops_object,
    trips.trip_id,
    trips.service_id,
    trips.direction_id,
    trips.agency_key,
    trips.shape_id,
    routes.route_id,
    routes.route_color,
    routes.route_long_name,
    routes.route_desc
FROM gtfs_stop_times AS stop_times

INNER JOIN gtfs_trips AS trips
    ON trips.trip_id = stop_times.trip_id AND trips.agency_key = stop_times.agency_key

INNER JOIN gtfs_routes AS routes ON trips.agency_key = routes.agency_key AND routes.route_id = trips.route_id

INNER JOIN gtfs_stops AS stops
    ON stops.stop_id = stop_times.stop_id
    AND stops.agency_key = stop_times.agency_key
    AND NOT EXISTS (
      SELECT 0
      FROM denormalized_max_stop_sequence AS max
      WHERE max.agency_key = stop_times.agency_key
      AND max.trip_id = stop_times.trip_id
      AND max.trip_max = stop_times.stop_sequence
    )
GROUP BY
    trips.trip_id,
    trips.service_id,
    trips.direction_id,
    trips.agency_key,
    trips.shape_id,
    routes.route_id,
    routes.route_color,
    routes.route_long_name,
    routes.route_desc
) as trps

如果我只运行内部选择语句,我会得到正确的结果。它们看起来像这样:(截图没有显示所有表格,因为它太长了)

但是,如果我执行插入语句并显示表的内容,我会得到如下内容:

您可能会注意到内容没有插入到表格的右列中。 agent_key 现在有 trip_id 的值,direction_id 现在是 service_id(还有更多的表被弄乱了)。

所以我的问题是我的插入语句将内容插入到新创建的表的错误列中我做错了什么?

感谢您的帮助。

【问题讨论】:

    标签: postgresql gtfs


    【解决方案1】:

    默认情况下,Postgres 将按照列在表中声明的顺序插入您的值;它与您的列在查询中的名称无关。

    https://www.postgresql.org/docs/9.5/static/sql-insert.html

    如果根本没有给出列名列表,则默认为按声明顺序排列的表的所有列;或前 N 列名称,如果 VALUES 子句或查询仅提供 N 列。

    您可以更改插入以声明您正在插入的列的顺序,或者您可以更改选择的顺序以匹配表中列的顺序。

    【讨论】:

    • 就是这样!我重新排序了我的选择语句,现在它可以工作了。这让我很头疼。感谢您的回答
    猜你喜欢
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    相关资源
    最近更新 更多