[MSSQL 2019] 사용자별 상위 카테고리가 포함된 데이터 조회 문의드립니다 0 2 3,500

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

by 마농 [2024.06.03 08:48:52]
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
;

 


by 토리 [2024.06.03 09:31:37]

많은 도움이 되었습니다.
감사합니다.
좋은 하루 되세요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입