Re: Different result depending on order of joins

From: Tim Rowe <digitig(at)gmail(dot)com>
To: "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org>
Subject: Re: Different result depending on order of joins
Date: 2015-05-22 13:06:59
Message-ID: CALWW4mpC_21AjSHTpBhWuhXAb=S6Dj9M25Wk39BGVXd4VwAvgg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Sorry to post this on the list, but I can't find any way of unsubscribing
-- I've looked in messages, on the community home pages and on a web
search, but all I find is a lot of other subscribers with the same problem.

How do I unsubscribe from this list, please?

On 22 May 2015 at 11:46, Nicklas Avén <nicklas(dot)aven(at)jordogskog(dot)no> wrote:

>
>
> 2015-05-22 skrev Albe Laurenz :
>
> Nicklas Avén wrote:
> >> I was a little surprised by this behavior.
> >> Is this what is supposed to happen?
> >>
> >> This query returns what I want:
> >>
> >> with
> >> a as (select generate_series(1,3) a_val)
> >> ,b as (select generate_series(1,2) b_val)
> >> ,c as (select generate_series(1,1) c_val)
> >> select * from a
> >> inner join c on a.a_val=c.c_val
> >> full join b on a.a_val=b.b_val
> >> ;
> >>
> >> I get all values from b since it only has a full join and nothing else.
> >>
> >> But if I change the order in the joining like this:
> >>
> >> with
> >> a as (select generate_series(1,3) a_val)
> >> ,b as (select generate_series(1,2) b_val)
> >> , c as (select generate_series(1,1) c_val)
> >> select * from a
> >> full join b on a.a_val=b.b_val
> >> inner join c on a.a_val=c.c_val
> >> ;
> >>
> >> also b is limited to only return value 1.
> >>
> >> I thought that the join was defined by "on a.a_val=c.c_val"
> >> and that the relation between b and the rest wasn't affected by that
> last inner join.
> >>
> >> I use PostgreSQL 9.3.6
> >>
> >> Is this the expected behavior?
> >
> >Yes.
> >
> >In
> >
> http://www.postgresql.org/docs/current/static/queries-table-expressions.html#QUERIES-JOIN
> >you can read:
> >
> > "In the absence of parentheses, JOIN clauses nest left-to-right."
> >
> >So the first query will first produce
> >
> > a_val | c_val
> >-------+-------
> > 1 | 1
> >
> >and the FULL JOIN will add a row for b_val=2 with NULL a_val.
> >
> >The second query will first produce
> >
> > a_val | b_val
> >-------+-------
> > 1 | 1
> > 2 | 2
> > 3 |
> >
> >an since none but the first row matches a_val=1, you'll get only that row
> in the result.
> >
> >Yours,
> >Laurenz Albe
>
>
> Thank you!
>
> Sorry for not finding it myself, but now I understand why it behaves
> like this :-)
>
> Thanks
>
> Nicklas
>

--
Tim Rowe

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Christofer C. Bell 2015-05-22 13:14:51 Re: Different result depending on order of joins
Previous Message Nicklas Avn 2015-05-22 10:46:27 Re: Different result depending on order of joins