을 얻을 수있는 방법이 코드
WITH cte AS (
SELECT
t1.name AS anchor_name
, t1.type AS type
, t2.parent
, 0 AS level
FROM #T1 t1 JOIN #T2 t2 ON t1.type = t2.type
UNION ALL
SELECT cte.anchor_name, cte.type, t2.parent, cte.level+1
FROM cte JOIN #T2 t2 ON cte.parent = t2.type
)
, tmp AS (
SELECT anchor_name, MAX(cte.level) AS max_level
FROM cte
GROUP BY cte.anchor_name
)
SELECT cte.anchor_name as name, cte.type
FROM tmp JOIN cte ON cte.anchor_name = tmp.anchor_name AND cte.level = tmp.max_level
이된다 그리고이 테스트 코드입니다 : 당신이 필요로하는
CREATE TABLE #T1 (
name VARCHAR(2)
, type VARCHAR(MAX)
);
CREATE TABLE #T2 (
type VARCHAR(MAX)
, parent VARCHAR(MAX)
);
INSERT INTO #T1 (name, type)
VALUES
('a1', 'artist')
,('a1', 'person')
,('a2', 'person')
,('a2', 'athlete')
,('a3', 'person')
,('a3', 'artist')
,('a3', 'actor');
INSERT INTO #T2 (type, parent)
VALUES
('artist' , 'person')
,('actor' , 'artist')
,('athlete' , 'person')
,('person' , '');
SELECT *
FROM #T1;
SELECT *
FROM #T2;
WITH cte AS (
SELECT
t1.name AS anchor_name
, t1.type AS type
, t2.parent
, 0 AS level
FROM #T1 t1 JOIN #T2 t2 ON t1.type = t2.type
UNION ALL
SELECT cte.anchor_name, cte.type, t2.parent, cte.level+1
FROM cte JOIN #T2 t2 ON cte.parent = t2.type
)
, tmp AS (
SELECT anchor_name, MAX(cte.level) AS max_level
FROM cte
GROUP BY cte.anchor_name
)
SELECT cte.anchor_name as name, cte.type
FROM tmp JOIN cte ON cte.anchor_name = tmp.anchor_name AND cte.level = tmp.max_level
http://rextester.com/TRD23741
가장 먼 노드가 무엇을 의미하는지 명확하게 설명합니다. – DVT
그냥 다시 썼습니다. 희망이 조금 더 명확합니다. – user1848018
mysql 또는 sql-server입니까? 귀하의 질문에 둘 다 태그가 붙어 있습니다. –