Thanks.... Got it

Regards,
Jitendra

On Fri 22 Feb, 2019, 4:03 PM mariusz <mar...@mtvk.pl wrote:

> On Fri, 22 Feb 2019 13:23:11 +0530
> Jitendra Loyal <jitendra.lo...@gmail.com> wrote:
>
> > I find that the RECURSIVE can be used only once in a CTE.
> >
> > I have the following use-case where there is a hierarchy of
> > store_groups, and then there are stores associated with a
> > store_group. Requirement is to ensure that a store can be used only
> > once in a store group hierarchy. Following definitions help:
> >
> > CREATE TABLE store_groups
> > (
> > store_group_id SERIAL NOT NULL CONSTRAINT StoreGroups_PK_StoreGroupID
> > PRIMARY KEY,
> > store_group_nm STXT NOT NULL,
> > -- On update, parent_store_group_id should not exist in the sub-tree
> > of store_group_id (if any). This is to prevent cycles. Trigger
> > ensures the same.
> > -- Another trigger ensures that the stores are unique in the new store
> > group hierarchy.
> > parent_store_group_id INTEGER NULL CONSTRAINT
> > StoreGroups_FK_ParentStoreGroupID
> > REFERENCES store_groups,
> > CONSTRAINT StoreGroups_UK_ParentStoreGroupID_StoreGroupName
> > UNIQUE ( parent_store_group_id, store_group_nm )
> > );
> >
> > CREATE TABLE store_group_stores
> > (
> > store_group_store_id SERIAL NOT NULL CONSTRAINT
> > StoreGroupStores_PK_StoreID PRIMARY KEY,
> > store_group_id INTEGER NOT NULL CONSTRAINT
> > StoreGroupStores_FK_StoreGroupID REFERENCES store_groups,
> > -- Trigger ensures that a store exists only once in a Group hierarchy
> > store_id INTEGER NOT NULL -- CONSTRAINT StoreGroupStores_FK_StoreID
> > -- REFERENCES stores,
> > -- Display order of the store in the Store Group
> > -- If display_order is not specified, stores should be listed in
> > alphabetical order
> > store_seq INTEGER NULL,
> > CONSTRAINT StoreGroupStores_UK_StoreGroupID_StoreID
> > UNIQUE ( store_group_id, store_id )
> > );
> >
> > To meet the above need, I was writing a funciton (which will be
> > called from triigers) with following algorithm:
> >
> >    1. root_group CTE to get the root store group (needs RECURSIVE)
> >    2. all_groups to collect all the store groups in root_group (needs
> >    RECURSIVE)
> >
> > On the second use, I get syntax error.  Kindly confirm that RECURSIVE
> > can be used only once. I will find an alternate mechanism.
> >
> > Thanks,
> > Jitendra Loyal
>
> hi,
>
> you CAN use multiple recursive ctes within one query, i've done this
> many times without issues having two or three recursive ctes between
> nonrecursive ones.
>
> you probably assumed that you need RECURSIVE keyword applied to cte,
> and got syntax errors with multiple RECURSIVE keywords.
>
> what you do is declare WITH RECURSIVE (RECURSIVE added to WITH keyword)
> stating that following ctes may contain recursive one (maybe more, and
> the recursive one need not be the first one).
>
> what makes cte a recursive one is it's content, that is union
> referencing self-cte within from clause.
>
> i admit that i haven't analyzed your store case to make even a simple
> working example of what you need, neither i'm pasting any exapmles of
> my own real queries (one i got open in terminal just now has about 400
> lines, 8 cte, 3 of which are recursive, that would rather be counter
> productive as a working example)
>
> just wanted to assure you that multiple recursive ctes within one query
> are possible and need only one RECURSIVE keyword appended to WITH
> keyword.
>
> regards, mariusz
>

Reply via email to