2017-05-16 3 views
0

gtfsフィードの一部のデータに対して非正規化テーブルを追加したいとします。そのために私は新しいテーブルを作成:PostgreSQLが値を誤って挿入する

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文を介して他の1つのテーブルからデータを転送します。ステートメントはかなり複雑です。

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 

私はちょうど正しい結果を得るために内部選択ステートメントを実行するとします。

Correct results

を(それはあまりにも長いですので、スクリーンショットは、すべてのテーブルを表示しません)しかし、私はINSERT文を実行し、テーブルの内容を表示する場合、私はこのような何かを得るでしょう:彼らはこのような何かを見て Wrong results

内容が表の右の列に挿入されないことがあります。 agency_keyにtrip_idの値が設定され、direction_idがservice_idになりました(そして、さらに多くのテーブルが混乱しています)。

私の質問は、私の挿入ステートメントが新しく作成されたテーブルの間違った列に内容を挿入するということです。

ありがとうございました。

答えて

3

Postgresは、デフォルトで列がテーブル内で宣言された順序で値を挿入します。それはあなたの列がクエリで指定されたものとは何の関係もありません。

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

列名のないリストが全く指定されていない場合、デフォルトでは、宣言順にテーブルのすべての列です。 VALUES句またはクエリによってN列のみが提供されている場合は、最初のN列名を使用します。

挿入する列の順序を宣言するか、または選択した順序を表の列の順序に合わせて変更できます。

+0

thats it!私は自分の選択した声明を並べ替え、今ではうまくいきます。それは私にかなりの頭痛を与えました。答えをありがとう –

関連する問題