| From: | Farid Hajji <farid(dot)hajji(at)ob(dot)kamp(dot)net> | 
|---|---|
| To: | "Eric G(dot) Miller" <egm2(at)jps(dot)net> | 
| Cc: | pgsql-general(at)postgresql(dot)org | 
| Subject: | Re: Trouble with strange OUTER JOIN syntax | 
| Date: | 2001-05-28 00:18:38 | 
| Message-ID: | 200105280018.f4S0Ic603555@suse-1.meta.net | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-general | 
> > Having examined the statements in more detail, it seems to me like
> > some kind of "multijoin" is required here:
> > 
> >   * outer-joining more than one table to a primary table:
> >      SELECT ... FROM tabmain, OUTER tab2, OUTER tab3
> > 
> > Here, I'll guess that both tab2 and tab3 are being outer-joined
> > to tabmain. Therefore tab2 and tab3 columns are allowed to
> > be null, whereas tabmain column's are not.
> > 
> >   * outer-joining one (or more than one) table to a cartesian
> >     product of other tables:
> >      SELECT ... FROM tab1, tab2, OUTER tab3
> >      SELECT ... FROM tab1, tab2, OUTER (tab3, tab4)
> >      SELECT ... FROM tab1, tab2, OUTER tab3, OUTER tab4
> > 
> > In the first example, tab3 is being joind to the cartesian product
> > (inner join) of both tab1 and tab2. Therefore tab1 x tab2 is not
> > allowed to be null, whereas tab3 is allowed to be.
> > 
> > The next examples seem to generalize this: two tables (tab3 and tab4)
> > are being outer-joined to existing cartesian product tab1 x tab2.
> > I'm not sure what the difference may be between:
> >   OUTER (tab3, tab4)
> > and
> >   OUTER tab3, OUTER tab4.
> > 
> > If PostgreSQL doesn't support this feature (yet?), I'll have to simulate
> > it programatically. I just hoped to avoid the trouble of doing so,
> > because the program I'm porting contains a lot of such "multijoins".
> 
> How 'bout:
> 
> SELECT * FROM foo LEFT JOIN bar ON foo.foo_id = bar.foo_id
> LEFT JOIN baz on bar.id = baz.bar_id;
> 
> simple example output:
> 
>  foo_id | data | foo_id | bar_id |  data   | baz_id | bar_id |    data     
> --------+------+--------+--------+---------+--------+--------+-------------
>       1 | one  |      1 |      1 | one-one |      1 |      1 | one-one-one
>       1 | one  |      1 |      1 | one-one |      2 |      1 | one-one-two
>       1 | one  |      1 |      2 | one-two |        |        | 
>       2 | two  |        |        |         |        |        | 
> (4 rows)
> 
> "baz" has no candidate with "bar_id" = 2, and "bar" has no candidate where 
> "foo_id" = 2. But it's not a product, as baz has a {3,3,'three-three-three'} 
> tuple that won't join.  You have to specify a join condition, or you get a 
> product.
Yes, chaining the outer join(s) did the trick for me here!
> Eric G. Miller <egm2(at)jps(dot)net>
Many thanks,
-Farid.
-- 
Farid Hajji -- Unix Systems and Network Admin | Phone: +49-2131-67-555
Broicherdorfstr. 83, D-41564 Kaarst, Germany  | farid(dot)hajji(at)ob(dot)kamp(dot)net
- - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - -
One OS To Rule Them All And In The Darkness Bind Them... --Bill Gates.
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Yann Ramin | 2001-05-28 01:21:21 | Re: database size including indexes | 
| Previous Message | Farid Hajji | 2001-05-28 00:11:19 | Re: Trouble with strange OUTER JOIN syntax |