X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id 806A452AC0 for ; Wed, 17 Aug 2005 16:31:22 -0300 (ADT) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 97526-05 for ; Wed, 17 Aug 2005 19:31:17 +0000 (GMT) Received: from priv-edtnes51.telusplanet.net (outbound04.telus.net [199.185.220.223]) by svr1.postgresql.org (Postfix) with ESMTP id 8FC1152ACC for ; Wed, 17 Aug 2005 16:31:15 -0300 (ADT) Received: from localhost ([199.185.220.240]) by priv-edtnes51.telusplanet.net (InterMail vM.6.01.04.04 201-2131-118-104-20050224) with ESMTP id <20050817193116.UZFF27125.priv-edtnes51.telusplanet.net@localhost>; Wed, 17 Aug 2005 13:31:16 -0600 Received: from 209.17.183.249 ( [209.17.183.249]) as user a3a18850@192.168.200.1 by webmail.telus.net with HTTP; Wed, 17 Aug 2005 12:31:16 -0700 Message-ID: <1124307076.4303908468d72@webmail.telus.net> Date: Wed, 17 Aug 2005 12:31:16 -0700 From: Mischa Sandberg To: Dmitri Bichko Cc: Lane Van Ingen , pgsql-sql@postgresql.org Subject: Re: Is it This Join Condition Do-Able? References: In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit User-Agent: Internet Messaging Program (IMP) 3.1-cvs X-Originating-IP: 209.17.183.249 X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=1.055 required=5 tests=[AWL=-0.371, DNS_FROM_RFC_POST=1.376, FORGED_RCVD_HELO=0.05] X-Spam-Level: * X-Archive-Number: 200508/131 X-Sequence-Number: 22359 Quoting Dmitri Bichko : > How about: > > SELECT a.keyfld, a.foo1, b.foo2, c.foo3 > FROM a > LEFT JOIN b USING(keyfld) > LEFT JOIN c USING(keyfld) ((( See response at end ))) > > -----Original Message----- > > [mailto:pgsql-sql-owner@postgresql.org] On Behalf Of Lane Van > Ingen > > Sent: Wednesday, August 17, 2005 12:55 PM > > Subject: [SQL] Is it This Join Condition Do-Able? > > > > Given three tables: a, b, c ; each consist of a 'keyfld' and > > a field called > > 'foo': > > tbl a tbl b tbl c > > --------- --------- --------- > > a.keyfld b.keyfld c.keyfld > > a.foo1 b.foo2 c.foo3 > > > > I want to always return all of tbl a; and I want to return > > b.foo2 and c.foo3 if they can be joined to based on keyfld.a; > > I know that it will involve a LEFT OUTER JOIN on table a, but > > have not seen any examples of joins like this on 3 or more tables. ... Having a bit of uncertainty of how LEFT JOIN associates, I tried the following test (psql -qe), with (to me) highly surprising results. Anyone care to comment on the third row of output? select version(); version ----------------------------------------------------------------------------------- PostgreSQL 8.0.3 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.3.3 (SuSE Linux) create temp table a(keyf int, val text); create temp table b(keyf int, val text); create temp table c(keyf int, val text); insert into a values(1, 'A1'); insert into a values(2, 'A2'); insert into a values(3, 'A3'); insert into a values(4, 'A4'); insert into b values(1, 'B1'); insert into b values(2, 'B2'); insert into c values(2, 'C2'); insert into b values(3, 'C3'); select keyf, a.val as aval, coalesce(b.val,'Bxx') as bval, coalesce(c.val,'Cxx') as cval from a left join b using(keyf) left join c using (keyf); keyf aval bval cval ---- ---- ---- ---- 1 A1 B1 Cxx 2 A2 B2 C2 3 A3 C3 Cxx 4 A4 Bxx Cxx