On Mon, 20 Aug 2001, will trillich wrote:
> i'm trying to wrap outer joins around my cerebellum:
>
> CUST:
> id serial
> name varchar(30)
> ITEM:
> cust integer references cust (id)
> data varchar(30)
> INFO:
> cust integer references cust (id)
> stuff text
>
> for my query i'd like, for every customer, to have
> item.* show up if it exists, and info.* show up
> if it exists...
>
> select
> CUST.name,
> ITEM.data,
> INFO.stuff
> from
> CUST left join ITEM on (CUST.id=ITEM.cust),
> CUST left join INFO on (CUST.id=INFO.cust)
> .... not!
>
> or does this need some subselect magic?
>
I think
from
cust left join item on (cust.id=item.cust) left join
info on (cust.id=info.cust)
might be what you want.
> and (separate question) is there a way to be sure that ONE or the
> OTHER or BOTH have joinable data, but don't show CUST if neither
> ITEM nor INFO has a match?
>
> foreach CUST
> if ITEM matches
> show record
> elsif INFO matches
> show record
> else -- neither matches
> dont show squat, not even from cust
> end if
> end foreach
I'd say something like "where item.cust is not null or
info.cust is not null"