2017-05-16 6 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 문을 통해 한 테이블에서 다른 테이블로 데이터를 전송하고 싶습니다. 진술은 다소 복잡합니다.

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! 내 선택 진술을 재정렬하고 지금은 작동합니다. 그것은 나에게 두통을 줬다. 답변 해주셔서 감사합니다 –