X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [64.117.224.130]) by svr1.postgresql.org (Postfix) with ESMTP id 5EB36D1B89B for ; Tue, 26 Aug 2003 00:12:47 -0300 (ADT) Received: from svr1.postgresql.org ([64.117.224.193]) by localhost (neptune.hub.org [64.117.224.130]) (amavisd-new, port 10024) with ESMTP id 37493-03 for ; Tue, 26 Aug 2003 00:12:16 -0300 (ADT) Received: from megazone.bigpanda.com (45.mufb.snfc.sffca01r18.dsl.att.net [12.103.249.45]) by svr1.postgresql.org (Postfix) with ESMTP id 60431D1B8C6 for ; Tue, 26 Aug 2003 00:12:15 -0300 (ADT) Received: by megazone.bigpanda.com (Postfix, from userid 1001) id 7E44CD71D; Mon, 25 Aug 2003 20:12:13 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by megazone.bigpanda.com (Postfix) with ESMTP id 6BB305C0F; Mon, 25 Aug 2003 20:12:13 -0700 (PDT) Date: Mon, 25 Aug 2003 20:12:13 -0700 (PDT) From: Stephan Szabo To: Joseph Shraibman Cc: Subject: Re: How to join from two tables at once? In-Reply-To: Message-ID: <20030825201102.T11277-100000@megazone.bigpanda.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Virus-Scanned: by amavisd-new at postgresql.org X-Archive-Number: 200308/299 X-Sequence-Number: 14915 On Mon, 25 Aug 2003, Joseph Shraibman wrote: > How can I join on one table with join conditions refering to two tables? In this example > p is missing an entry that corresponds to u. I want to select from u and p, but have > entries in u that don't have an entry in p. The problem is I need to go through table a > to get the corresponding value in table p, and a LEFT JOIN only operates on two tables. > The subselect works, but in real life turns out to be a big performance drain. > > --------------------------------- > example: > > > begin; > > create table u (uid int, aid int, txt text); > create table a (id int, pkey int); > create table p (uid int, pkey int, val text); > > insert into u VALUES(1,1,'one'); > insert into u VALUES(2,1,'two'); > insert into u VALUES(3,1,'three'); > > insert into a VALUES(1, 9); > > insert into p VALUES(1,9,'ONE'); > insert into p VALUES(3,9,'THREE'); > > -- doesn't get 2, because there is no entry in p for it > SELECT u.uid, u.txt, p.val FROM u,a,p WHERE u.uid = p.uid and a.id = u.aid and p.pkey = > a.pkey; > > -- works, but uses a subselect > SELECT u.uid, u.txt, (SELECT p.val FROM p WHERE p.uid = u.uid AND p.pkey = a.pkey) FROM > u,a WHERE a.id = u.aid; > > --doesn't work: ERROR: JOIN/ON clause refers to "u", which is not part of JOIN > SELECT u.uid, u.txt, p.val FROM u,a LEFT JOIN p ON p.uid = u.uid AND p.pkey = a.pkey > WHERE a.id = u.aid; Probably you want something like: SELECT u.uid, u.txt, p.val FROM u INNER JOIN a ON (a.id=u.aid) LEFT JOIN p ON (p.uid=u.uid AND p.pkey=a.pkey);