Dit probleem ziet er eigenlijk eenvoudiger uit dan het antwoord op de vraag die je hebt gelinkt, wat een uitstekende oplossing voor dat probleem is. Desalniettemin gebruikt dit dezelfde hiërarchische zoekopdrachten, met connect by
Als het zo is dat priority
is altijd een doorlopende reeks getallen, dit zal werken
SELECT t.grp, level, ltrim(SYS_CONNECT_BY_PATH(state,','),',') as "set"
from t
start with priority = 1
connect by priority = prior priority + 1
and grp = prior grp
Als dat echter niet altijd waar is, hebben we row_number()
. nodig om de reeks te definiëren op basis van de volgorde van prioriteit (die niet opeenvolgend geheel getal hoeft te zijn)
with t2 AS
(
select t.*, row_number()
over ( partition by grp order by priority) as rn from t
)
SELECT t2.grp, ltrim(SYS_CONNECT_BY_PATH(state,','),',') as "set"
from t2
start with priority = 1
connect by rn = prior rn + 1
and grp = prior grp