Thread: example of [outer] join

example of [outer] join

From
Gary Stainburn
Date:
Hi, me again.

I'm having fun here, but here's another question for you.

Could someone please give me an example of a join where one of the fields is 
missing - I think reading from the docs that this is an OUTER join, but I'm 
having a problem with the syntax.  I'm trying to create a view that pulls in 
all the relevent details for a single member.

I'm still with my members table, which has links to the address table (m.madd 
= a.aid), teams table (m.mteam = t.tid) and the email table (m.memail = 
e.eid).

While every member has an address, and every member belongs to a team, not 
everyone has an email address.  My problem is that every member without an 
email address gets omitted from the result set.

My view so far is:
CREATE view member_dets as  select *,         getphone(m.mphone) as phone,         getphone(m.mfax) as fax,
getphone(m.mmobile)as mobile,        getunitno(m.mid) as munitno   from members m,         address a,        teams t,
    emails e  where m.madd = a.aid and        m.memail = e.eid and        m.mteam = t.tid;
 
-- 
Gary Stainburn
This email does not contain private or confidential material as it
may be snooped on by interested government parties for unknown
and undisclosed purposes - Regulation of Investigatory Powers Act, 2000     


Re: example of [outer] join

From
David Stanaway
Date:
On Friday, July 20, 2001, at 08:22  PM, Gary Stainburn wrote:

My view so far is:
CREATE view member_dets as
   select *,
          getphone(m.mphone) as phone,
          getphone(m.mfax) as fax,
          getphone(m.mmobile) as mobile,
          getunitno(m.mid) as munitno
     from members m,
          address a,
          teams t,
          emails e
    where m.madd = a.aid and
          m.memail = e.eid and
          m.mteam = t.tid;

Try

CREATE VIEW member_dets AS
   SELECT *,
          getphone(m.mphone) AS phone,
          getphone(m.mfax) AS fax,
          getphone(m.mmobile) AS mobile,
          getunitno(m.mid) AS munitno
    FROM members m
    -- every member has an address
    JOIN  address a ON m.madd = a.aid
    -- not everyone has an email address
    LEFT JOIN emails e ON m.memail = e.eid
    -- every member belongs to a team
    JOIN team t ON m.mteam = t.tid;

You will need postgresql 7.1 for this syntax, otherwise, refer to the
docs on how do do outer joins using unions (Pretty messy esp if you have
more than one...  One very good reason to upgrade to 7.1 if you are
still using an earlier version of postgres)

==============================
David Stanaway
Personal: david@stanaway.net
Work: david@netventures.com.au

RE: example of [outer] join

From
Jeff Eckermann
Date:
You could make your FROM clause something like:
FROM members m
    INNER JOIN address a ON m.madd = a.aid
    INNER JOIN teams t ON m.team = t.tid
    LEFT JOIN emails e ON m.memail = e.eid
I think that should work: if not, try putting everything between (but not
including) FROM and LEFT JOIN in brackets (parentheses for those over the
pond :-))

> -----Original Message-----
> From:    Gary Stainburn [SMTP:gary.stainburn@ringways.co.uk]
> Sent:    Friday, July 20, 2001 5:22 AM
> To:    pgsql-sql
> Subject:    example of [outer] join
>
> Hi, me again.
>
> I'm having fun here, but here's another question for you.
>
> Could someone please give me an example of a join where one of the fields
> is
> missing - I think reading from the docs that this is an OUTER join, but
> I'm
> having a problem with the syntax.  I'm trying to create a view that pulls
> in
> all the relevent details for a single member.
>
> I'm still with my members table, which has links to the address table
> (m.madd
> = a.aid), teams table (m.mteam = t.tid) and the email table (m.memail =
> e.eid).
>
> While every member has an address, and every member belongs to a team, not
>
> everyone has an email address.  My problem is that every member without an
>
> email address gets omitted from the result set.
>
> My view so far is:
> CREATE view member_dets as
>   select *,
>          getphone(m.mphone) as phone,
>          getphone(m.mfax) as fax,
>          getphone(m.mmobile) as mobile,
>          getunitno(m.mid) as munitno
>     from members m,
>          address a,
>          teams t,
>          emails e
>    where m.madd = a.aid and
>          m.memail = e.eid and
>          m.mteam = t.tid;
> --
> Gary Stainburn
>
> This email does not contain private or confidential material as it
> may be snooped on by interested government parties for unknown
> and undisclosed purposes - Regulation of Investigatory Powers Act, 2000
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo@postgresql.org so that your
> message can get through to the mailing list cleanly