スタックオーバーフローでSQLを使用してそれを取得する方法あなたは常にあなたがしようとしているものの例を含める必要があり、コーディングサイトではありません。それは私がこれをとても興味をそそられると感じた、私はそれを自分自身で試してみると思いました。
これは全くブルートフォース方式です。私は、それらを一緒に持ってLISTAGGを使用し、各レベルから階層を抽出します。
WITH
category
AS
(SELECT '100' category_id, NULL parent_id
FROM DUAL
UNION ALL
SELECT '101' category_id, '100' parent_id
FROM DUAL
UNION ALL
SELECT '102' category_id, '101' parent_id
FROM DUAL
UNION ALL
SELECT '103' category_id, '101' parent_id
FROM DUAL),
GROUPING
AS
(SELECT '200' GROUPING_ID, NULL parent_id, '101' category_id
FROM DUAL
UNION ALL
SELECT '201' GROUPING_ID, '200' parent_id, '101' category_id
FROM DUAL
UNION ALL
SELECT '202' GROUPING_ID, '201' parent_id, '101' category_id
FROM DUAL
UNION ALL
SELECT '203' GROUPING_ID, NULL parent_id, '102' category_id
FROM DUAL),
performer
AS
(SELECT '300' performer_id, '202' GROUPING_ID, '101' category_id
FROM DUAL
UNION ALL
SELECT '301' performer_id, '201' GROUPING_ID, '101' category_id
FROM DUAL
UNION ALL
SELECT '302' performer_id, '203' GROUPING_ID, '103' category_id
FROM DUAL
UNION ALL
SELECT '303' performer_id, NULL GROUPING_ID, '102' category_id
FROM DUAL),
pset (p_gid, p_parentid, p_catid)
AS
(SELECT GROUPING.GROUPING_ID, parent_id, GROUPING.category_id
FROM performer INNER JOIN GROUPING ON performer.GROUPING_ID = GROUPING.GROUPING_ID
WHERE performer_id = '300'
UNION ALL
SELECT GROUPING_ID, parent_id, category_id
FROM pset INNER JOIN GROUPING ON GROUPING_ID = p_parentid),
cset (p_catid, p_parent)
AS
(SELECT p_catid, parent_id
FROM pset INNER JOIN category ON pset.p_catid = category.category_id
UNION ALL
SELECT category_id, parent_id
FROM cset INNER JOIN category ON category_id = p_parent),
dset
AS
(SELECT p_catid
FROM cset
UNION
SELECT p_gid
FROM pset
UNION
SELECT '300'
FROM DUAL)
SELECT LISTAGG (p_catid, '->') WITHIN GROUP (ORDER BY p_catid DESC) AS performer_chain
FROM dset
そして、答えは
PERFORMER_CHAIN
300->202->201->200->101->100
です