Запрос, чтобы получить отношение проекта "один ко многим" и "многие к одному сотруднику"

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

Стол:

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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

        ;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) 

Для идентификации сотрудника, работающего более чем над одним проектом, текущее решение может не сработать. Как и в случае с плотным рангом, вы получите ранг №1 только для одного сотрудника, например, E105, если он также работает над проектом P3, тогда ваше решение может не сработать... )>1

Mahesh 28.05.2019 07:48

@Mahesh: спасибо за ваше предложение, я обновил свой запрос, пожалуйста, проверьте сейчас.

DarkRob 28.05.2019 14:07

Другие вопросы по теме