안녕하세요.
테이블은 전체 카테고리(Cate)와 사용자별 카테고리(CateUser)를 가지고 있습니다.
사용자별 카테고리에 대해 전체 카테고리의 상위 카테고리가 포함된 데이터를 조회 하려고 합니다.
전체 카테고리 (Cate)
cateId cateParentId cateName
------------------------------------------
1 NULL Cate
2 1 Cate1
3 2 Cate1-1
4 3 Cate1-1-1
5 3 Cate1-1-2
6 2 Cate1-2
7 6 Cate1-2-1
8 1 Cate2
9 8 Cate2-1
10 8 Cate2-2
11 1 Cate3
12 11 Cate3-1
13 12 Cate3-1-1
14 12 Cate3-1-2
------------------------------------------
사용자별 카테고리 (CateUser)
cateId userId
-------------------
5 user1
9 user1
4 user2
5 user2
10 user2
13 user2
-------------------
예를 들어
사용자별 카테고리 데이터에 사용자1의 카테고리 Cate1-1-2, Cate2-1 가 있다면 아래 처럼 조회가 됩니다.
cateId cateName
--------------------
1 Cate
2 Cate1
3 Cate1-1
5 Cate1-1-2
8 Cate2
9 Cate2-1
WITH Cate AS
(
SELECT 1 cateId, NULL cateParentId, 'Cate' cateName
UNION ALL SELECT 2, 1, 'Cate1'
UNION ALL SELECT 3, 2, 'Cate1-1'
UNION ALL SELECT 4, 3, 'Cate1-1-1'
UNION ALL SELECT 5, 3, 'Cate1-1-2'
UNION ALL SELECT 6, 2, 'Cate1-2'
UNION ALL SELECT 7, 6, 'Cate1-2-1'
UNION ALL SELECT 8, 1, 'Cate2'
UNION ALL SELECT 9, 8, 'Cate2-1'
UNION ALL SELECT 10, 8, 'Cate2-2'
UNION ALL SELECT 11, 1, 'Cate3'
UNION ALL SELECT 12, 11, 'Cate3-1'
UNION ALL SELECT 13, 12, 'Cate3-1-1'
UNION ALL SELECT 14, 12, 'Cate3-1-2'
)
, CateUser AS
(
SELECT 5 cateId, 'user1' userId
UNION ALL SELECT 9, 'user1'
UNION ALL SELECT 4, 'user2'
UNION ALL SELECT 5, 'user2'
UNION ALL SELECT 10, 'user2'
UNION ALL SELECT 13, 'user2'
)
, tmp AS
(
SELECT *
FROM Cate
WHERE cateId IN (SELECT cateId FROM CateUser WHERE userId = 'user1')
UNION ALL
SELECT p.*
FROM tmp c
INNER JOIN Cate p
ON c.cateParentId = p.cateId
)
SELECT DISTINCT
cateId, cateName
FROM tmp
ORDER BY cateId
;
많은 도움이 되었습니다.
감사합니다.
좋은 하루 되세요.