Received: from localhost (unknown [200.46.204.184]) by postgresql.org (Postfix) with ESMTP id 43A802E46E7 for ; Thu, 10 Jan 2008 18:18:44 -0400 (AST) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.184]) (amavisd-maia, port 10024) with ESMTP id 13905-04 for ; Thu, 10 Jan 2008 18:18:25 -0400 (AST) Received: from mail11.syd.optusnet.com.au (mail11.syd.optusnet.com.au [211.29.132.192]) by postgresql.org (Postfix) with ESMTP id E03B12E46E4 for ; Thu, 10 Jan 2008 18:18:38 -0400 (AST) Received: from [172.17.2.31] (203-59-134-193.perm.iinet.net.au [203.59.134.193]) (authenticated sender plengada) by mail11.syd.optusnet.com.au (8.13.1/8.13.1) with ESMTP id m0AMIUAi007145; Fri, 11 Jan 2008 09:18:32 +1100 Message-ID: <478699D0.7070608@optusnet.com.au> Date: Fri, 11 Jan 2008 07:18:56 +0900 From: Paul Lambert User-Agent: Thunderbird 2.0.0.9 (Windows/20071031) MIME-Version: 1.0 To: Colin Wetherbee , pgsql-sql@postgresql.org Subject: Re: JOIN a table twice for different values in the same query References: <47869704.8050306@denterprises.org> In-Reply-To: <47869704.8050306@denterprises.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200801/78 X-Sequence-Number: 29931 Colin Wetherbee wrote: > Greetings. > > I have two tables I'm having a little trouble figuring out how to JOIN. > > One contains a list of airports along with their IATA codes, cities, > names, and so forth. This table also contains an id column, which is a > serial primary key. > > The other table contains a list of flights, each of which has a > departure_port and an arrival_port, which are foreign keys referencing > the id field of the first table. > > I would like to construct a query on the flight table that returns the > names of both the departure port and the arrival port. > > The following query shows how I would get just the departure port. > > js=# SELECT departure_date, jsports.code AS departure_code FROM > jsjourneys JOIN jsports ON jsjourneys.departure_port = jsports.id LIMIT > 4; > > departure_date | departure_code > ----------------+---------------- > 2006-11-19 | ATL > 2006-11-16 | ATL > 2006-11-19 | BHM > 2007-02-03 | BOS > (4 rows) > > When I SELECT jsports.code, the result comes from the JOIN ... ON > jsjourneys.departure_port = jsports.id. > > I would *also* like to include something in the query to get the > jsports.code for jsjourneys.arrival_port, but I'm unsure how to do this, > since SELECTing jsports.code twice would be ambiguous (and, in any case, > just duplicates the departure_code). > > I'd like to produce a result set that looks something like the following > (which doesn't come from a real query). > > departure_date | departure_code | arrival_code > ----------------+----------------+-------------- > 2006-11-19 | ATL | JFK > 2006-11-16 | ATL | DFW > 2006-11-19 | BHM | IAH > 2007-02-03 | BOS | LAX > > I'd appreciate some help. > > FYI, table definitions for jsjourneys and jsports follow. > > js=# \d jsjourneys > Table "public.jsjourneys" > Column | Type | Modifiers > ---------------------+--------------------------+--------------------------------------------------------- > > id | bigint | not null default > nextval('jsjourneys_id_seq'::regclass) > userid | bigint | not null > typeid | integer | not null > carrier | integer | > number | integer | > departure_port | integer | not null > arrival_port | integer | not null > departure_gate | character varying | > arrival_gate | character varying | > departure_date | date | not null > fare_class | integer | > scheduled_departure | timestamp with time zone | > scheduled_arrival | timestamp with time zone | > actual_departure | timestamp with time zone | > actual_arrival | timestamp with time zone | > equipment | integer | > notes | character varying(1500) | > seat | character varying(4) | > confirmation | character varying(20) | > Indexes: > "jsjourneys_pkey" PRIMARY KEY, btree (id) > Foreign-key constraints: > "jsjourneys_arrival_port_fkey" FOREIGN KEY (arrival_port) REFERENCES > jsports(id) > "jsjourneys_carrier_fkey" FOREIGN KEY (carrier) REFERENCES > jscarriers(id) > "jsjourneys_departure_port_fkey" FOREIGN KEY (departure_port) > REFERENCES jsports(id) > "jsjourneys_equipment_fkey" FOREIGN KEY (equipment) REFERENCES > jsequipment(id) > "jsjourneys_fare_class_fkey" FOREIGN KEY (fare_class) REFERENCES > jsfareclasses(id) > "jsjourneys_typeid_fkey" FOREIGN KEY (typeid) REFERENCES > jsjourneytypes(id) > "jsjourneys_userid_fkey" FOREIGN KEY (userid) REFERENCES jsusers(id) > > js=# \d jsports > Table "public.jsports" > Column | Type | Modifiers > -----------+-------------------+------------------------------------------------------ > > id | integer | not null default > nextval('jsports_id_seq'::regclass) > code | character varying | not null > city | character varying | not null > full_city | character varying | not null > name | character varying | > Indexes: > "jsports_pkey" PRIMARY KEY, btree (id) > "jsports_index_city" btree (city) > "jsports_index_code" btree (code) > > Thanks! > > Colin > > ---------------------------(end of broadcast)--------------------------- > TIP 4: Have you searched our list archives? > > http://archives.postgresql.org > Try joining twice, something like: SELECT departure_date, dp.code AS departure_code, ap.code AS arrival_code FROM jsjourneys JOIN jsports dp ON jsjourneys.departure_port = jsports.id JOIN jsports ap ON jsjourneys.arrival_port=jsports.id