Обсуждение: problem with update from subselect

Поиск
Список
Период
Сортировка

problem with update from subselect

От
Gary Stainburn
Дата:
Hi all, using the schema described below, I want to be able to update each 
arrival time from departure times and trip lengths.

However the update fails because the subselect returns all three answers.

How would I correct the update to make it work

update trip set trip_arrive = (select t.trip_depart + r.route_time from route r, trip t where r.routeid =
t.trip_route);

Database definition:
drop table route;
drop table trip;
drop sequence route_id_seq;
drop sequence trip_id_seq;

create sequence "route_id_seq" start 1 increment 1;
create sequence "trip_id_seq" start 1 increment 1;
create table route ( routeid int4 unique default nextval('route_id_seq'::text) not null, route_depart character (4),
--std ICAO code e.g. EGNM route_dest   character (4),  -- ditto route_time   interval, primary key (routeid)
 
);

create table trip ( tripid int4 unique default nextval('trip_id_seq'::text) not null, trip_route int4 references
route(routeid),trip_depart timestamp,  -- departure time trip_arrive timestamp,  -- calculated ETA primary key
(tripid)
);

insert into route values (1, 'EGNM', 'EGLL', '1 hour 40 minutes');
insert into route values (2, 'EGLL', 'EGKK', '30 minutes');
insert into trip values (1, 1, '2002-01-01 10:00:00');
insert into trip values (2, 1, '2002-02-01 11:30:00');
insert into trip values (3, 2, '2002-01-01 11:00:00');


-- 
Gary Stainburn
This email does not contain private or confidential material as it
may be snooped on by interested government parties for unknown
and undisclosed purposes - Regulation of Investigatory Powers Act, 2000     


Re: problem with update from subselect

От
Stephan Szabo
Дата:
On Wed, 1 May 2002, Gary Stainburn wrote:

> Hi all, using the schema described below, I want to be able to update each
> arrival time from departure times and trip lengths.
>
> However the update fails because the subselect returns all three answers.
>
> How would I correct the update to make it work
>
> update trip set trip_arrive = (select t.trip_depart + r.route_time
>   from route r, trip t where r.routeid = t.trip_route);

Do you really want to join with another "trip" in the subselect?

I think you probably want something like:
update trip set trip_arrive = (select trip.trip_depart + r.route_timefrom route r where r.routeid=trip.trip_route);



Re: problem with update from subselect

От
Joe Conway
Дата:
Gary Stainburn wrote:
> Hi all, using the schema described below, I want to be able to update each 
> arrival time from departure times and trip lengths.
> 
> However the update fails because the subselect returns all three answers.
> 
> How would I correct the update to make it work
> 
> update trip set trip_arrive = (select t.trip_depart + r.route_time
>   from route r, trip t where r.routeid = t.trip_route);
> 

If I understand what you're trying to do correctly, this works:

test=# update trip set trip_arrive = trip_depart + r.route_time from 
route r where r.routeid = trip.trip_route;              UPDATE 3
test=# select * from trip; tripid | trip_route |     trip_depart     |     trip_arrive
--------+------------+---------------------+---------------------      1 |          1 | 2002-01-01 10:00:00 |
2002-01-0111:40:00      2 |          1 | 2002-02-01 11:30:00 | 2002-02-01 13:10:00      3 |          2 | 2002-01-01
11:00:00| 2002-01-01 11:30:00
 
(3 rows)


HTH,
Joe