Запрос, чтобы получить отношения проекта один ко многим и много к одному сотруднику - PullRequest
1 голос
/ 28 мая 2019

У меня есть следующая таблица:

Таблица:

create table emp_project_mapping 
(
    emp_id varchar(10),
    pro_id varchar(10)
)

Записи:

insert into emp_project_mapping values('E101','P1'),
                                      ('E101','P2'),
                                      ('E102','P1'),
                                      ('E103','P3'),
                                      ('E104','P3'),
                                      ('E105','P4');

Запрос 1 : Найти сотрудника, которыйработает над более чем одним проектом.

Ожидаемый результат:

emp_id  pro_id
--------------
E101    P1
E101    P2                        

Запрос 2 : найдите более одного сотрудника, работающего в одном проекте.

emp_id  pro_id
--------------
E103    P3
E104    P3  
E101    P1
E102    P1

Попробуйте :

Запрос 1:

;WITH CTE
AS
(
    SELECT  emp_id,
            pro_id,
            DENSE_RANK() over(order by emp_id) empid_rank,
            DENSE_RANK() over(order by pro_id) proid_rank
    FROM emp_project_mapping
)
SELECT emp_id,pro_id
FROM CTE
WHERE empid_rank = 1 and proid_rank>1

Вывод:

emp_id  pro_id
---------------
E101    P2                                    

Запрос 2:

;WITH CTE
AS
(
    SELECT  emp_id,
            pro_id,
            DENSE_RANK() over(order by emp_id) empid_rank,
            DENSE_RANK() over(order by pro_id) proid_rank
    FROM emp_project_mapping
)
SELECT emp_id,pro_id
FROM CTE
WHERE empid_rank > 1 and proid_rank = 1

Выход:

emp_id  pro_id
----------------
E102    P1

1 Ответ

1 голос
/ 28 мая 2019

Вы можете попробовать это ....

Для первого решения

        ;WITH CTE
        AS
        (
            SELECT  emp_id,
                    pro_id,
                    ROW_NUMBER() OVER (PARTITION BY emp_id ORDER BY pro_id) empid_rank
            FROM emp_project_mapping
        )
        SELECT * from emp_project_mapping WHERE emp_id IN (SELECT emp_id
        FROM CTE
        WHERE empid_rank > 1 )

Для второго решения

        ;WITH CTE
        AS
        (
            SELECT  emp_id,
                    pro_id,
                    ROW_NUMBER() OVER (PARTITION BY pro_id ORDER BY emp_id) proid_rank
            FROM emp_project_mapping
        )
        SELECT * FROM emp_project_mapping WHERE pro_id IN (SELECT pro_id 
        FROM CTE 
        WHERE proid_rank>1) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...