Thread: not grokking outer joins...

not grokking outer joins...

From
will trillich
Date:
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?

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

--
Khan said that revenge is a dish best served cold. I think
sometimes it's best served hot, chunky, and foaming.
    - P.J.Lee ('79-'80)

will@serensoft.com
http://sourceforge.net/projects/newbiedoc -- we need your brain!
http://www.dontUthink.com/ -- your brain needs us!

Re: not grokking outer joins...

From
Stephan Szabo
Date:
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"