관리자 아래의 직원 수를 가져오기 위한 중첩 쿼리
create table employee (
Id int,
ManagerId int);
insert into employee values
(1, 3),
(2, 3),
(3, 6),
(4, 7),
(5, 7),
(6, 8),
(7, 6);
select * from employee;
표는 다음과 같습니다.
종업원 수가 많은 매니저에게 질문서를 작성하는 방법중첩된 구조를 확인합니다.위의 예에 대한 결과는 다음과 같습니다.
Id | number_of_employees
3 | 2
7 | 2
6 | 6
8 | 7
여기 있어요!!
With recursive cte as (
select id,Managerid from employee --> Anchor Query
union all
select c.Id,e.ManagerId from cte c --> Recursive Member
join employee e on (c.ManagerId=e.Id)) --> Termination Condition
select ManagerId,count(Id) as Number_of_Employees
from cte group by ManagerId
갱신하다
알았어, 내가 설명해줄게.
우선, 매니저와 매니저의 부하를 톱 레벨(모든 조합)까지 리스트 한 표를 생성해 둘 필요가 있습니다.아래가 되겠죠?이것을 결과표라고 부릅니다.
-------------------------
| Id | ManagerId |
-------------------------
| 1 | 3 |--
| 2 | 3 | |
| 3 | 6 | |
| 4 | 7 | |->From your table
| 5 | 7 | |
| 6 | 8 | |
| 7 | 6 |--
| 2 | 6 |--
| 1 | 6 | |
| 7 | 8 | |
| 3 | 8 | |
| 5 | 6 | |-> Nested structure which you meant in the question
| 4 | 6 | |
| 4 | 8 | |
| 5 | 8 | |
| 1 | 8 | |
| 2 | 8 |--
-------------------------
위의 표를 얻으면 다음 정보를 얻을 수 있습니다.count
사용.group by
부장님아이디. 그럼 어떻게 해야 되지?
1) 직접 종업원을 고용할 수 있습니다.
select Id,ManagerId from employee -- let's call this as QueryE1
2) 이제 같은 테이블에서 1급 매니저와 종업원을 모시겠습니다.
select e1.Id,e2.ManagerId from employee e1 join employee e2 on e1.managerid = e2.id
--QueryE2
-------------------------
| Id | ManagerId |
-------------------------
| 1 | 6 |
| 2 | 6 |
| 3 | 8 |
| 7 | 8 |
| 4 | 6 |
| 5 | 6 |
-------------------------
3) 상기 표를 참조표(QueryE2)로 간주하여 직원표와 연계하여 직원과 함께 2급 관리자를 파악한다.여기서 8은 6의 관리자이기 때문에 6의 모든 보고자는 8의 보고자이기도 합니다.
SELECT e3.id,e4.managerid
FROM (SELECT e1.id,e2.managerid
FROM employee e1 JOIN employee e2
ON e1.managerid = e2.id) e3
JOIN employee e4
ON e3.managerid = e4.id -- QueryE3
-------------------------
| Id | ManagerId |
-------------------------
| 1 | 8 |
| 2 | 8 |
| 4 | 8 |
| 5 | 8 |
-------------------------
4) 매니저가 없어질 때까지 상기 절차를 반복한다.이제 우리는 8명의 매니저가 없다는 것을 안다.하지만 쿼리가 무엇을 말하는지 봅시다.이제 최신 표(위)를 참고 표로 고려해야 합니다.
SELECT e5.id,e6.managerid
FROM (SELECT e3.id,e4.managerid
FROM (SELECT e1.id,e2.managerid
FROM employee e1
JOIN employee e2
ON e1.managerid = e2.id) e3
JOIN employee e4
ON e3.managerid = e4.id) e5
JOIN employee e6
ON e5.managerid = e6.id --QueryE4-- returns 0 rows as well
마지막으로 이 모든 쿼리의 값을 모두 조합하면 필요한 결과 테이블을 얻을 수 있습니다.이 모든 것은 우리에 의해 행해졌다.RECURSIVE CTE
1개의 쿼리에서요.여기서QueryE1
는 Anchor Query 입니다. QueryE2,QueryE3 & QueryE4
재귀 멤버는 0행까지 CTE에 의해 작성됩니다.결과 테이블이 생성되면 이를 사용하여 요구를 맞춤화할 수 있습니다.하고 있습니다Group by
을 손에 넣다count
매니저의아이디. 혼란이 해소될지는 모르겠지만 적어도 아이디어를 얻기를 바랍니다.
언급URL : https://stackoverflow.com/questions/58796003/nested-query-to-get-number-of-employees-under-managers
'programing' 카테고리의 다른 글
React의 이벤트 개체에서 사용자 지정 특성에 액세스하는 방법은 무엇입니까? (0) | 2023.01.17 |
---|---|
MySQL AVG 함수가 예상보다 많은 십진수를 제공함 (0) | 2023.01.17 |
MySQL - 그룹에 의해 반환되는 행을 제어합니다. (0) | 2023.01.17 |
카운트다운이 카운트다운보다 빠릅니까? (0) | 2023.01.17 |
마리아에서 열 이름 변경DB (0) | 2023.01.17 |