by 토리 [SQLServer] 카테고리 권한 메뉴 [2024.06.02 13:51:41]
안녕하세요.
테이블은 전체 카테고리(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 ;