From: | Jing Fan <fanjing09(at)gmail(dot)com> |
---|---|
To: | Albe Laurenz <laurenz(dot)albe(at)wien(dot)gv(dot)at> |
Cc: | "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: WITH RECURSIVE doesn't work properly for me |
Date: | 2013-11-06 14:53:15 |
Message-ID: | CA+Bectk=hL08A+DEASMLYNDXy6rV7MU5ECZMMwa4kNJ5wHH-Rg@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
Yeah, that can explain why it doesn't work.
Thank you very much:)
On Wed, Nov 6, 2013 at 8:40 AM, Albe Laurenz <laurenz(dot)albe(at)wien(dot)gv(dot)at>wrote:
> Jing Fan wrote:
> > On Wed, Nov 6, 2013 at 8:10 AM, Albe Laurenz <laurenz(dot)albe(at)wien(dot)gv(dot)at>
> wrote:
> >> Let's assume that we have three nodes A, B and C.
> >> Also, A points to B, B points to C and C points to B.
> >>
> >> Let's assume that we already generated (A, B, 1) and (A, C, 2)
> >> in previous iterations.
> >>
> >> Then the "recursive statement" will generate the new
> >> rows (A, C, 2) and (A, B, 3).
> >> The SELECT ... GROUP BY only surrounds the recursive statement,
> >> So the result will still be (A, C, 2) and (A, B, 3).
> >>
> >> Then the UNION will take care of the first triple, but the second
> >> one will be added in this iteration.
> >>
> >> And so on ad infinitum.
>
> > But after this iteration, the paths will be:
> > A B 1
> > B C 1
> > C B 1
> > A C 2
> > A B 3
> >
> > in next iteration, the recursive statement will generate (A,C,2),
> (A,B,3), and (A,C,4), after the
> > group by, it will still be (A,C,2) and (A,B,3)
> > so I think it should stop after this iteration.
>
> I see, I didn't notice that.
>
> Actually there is a mistake in my explanation above, see
>
> http://www.postgresql.org/docs/9.3/static/queries-with.html#QUERIES-WITH-SELECT
> "Recursive Query Evaluation" for a detailed explanation:
>
> In step 2b, the "working table" is replaced with the "intermediate table",
> so the next iteration does not see all previously generated rows,
> but only the ones that were generated in the previous iteration.
>
> So in our case, the working table will look like this:
>
> Initially:
> A B 1
> B C 1
> C B 1
>
> After the first iteration:
> A C 2
>
> After the third iteration:
> A B 3
>
> After the fourth iteration:
> A C 4
>
> ... and so on.
>
> Your GROUP BY assumes that the working table contains
> all previously generated rows.
>
> Yours,
> Laurenz Albe
>
From | Date | Subject | |
---|---|---|---|
Next Message | Joshua D. Drake | 2013-11-06 16:10:44 | Re: Is it advisable to pg_upgrade directly from 9.0 to 9.3? |
Previous Message | Albe Laurenz | 2013-11-06 14:40:23 | Re: WITH RECURSIVE doesn't work properly for me |