#sql-server-2008 #duplicates #inner-join
#sql-server-2008 #дубликаты #внутреннее соединение
Вопрос:
Использование SQL 2008 R2. Я пытаюсь найти активных сотрудников, которые ранее были сотрудниками в одной из наших других компаний. Следующий код работает; однако я заметил, что если Сотрудник работал более чем в двух компаниях, я получаю дубликаты. Есть ли другой способ, которым мне нужно написать это, чтобы я не получал дубликатов? Я пытался использовать Group By и case с when exist, и, похоже, ничего не работает.
ОБРАЗЕЦ ДАННЫХ
╔═════════════╦══════╦══════════╦══════════╦══════════╦══════════╗
║ SSN ║ PRCo ║ Employee ║ FullName ║ HireDate ║ ActiveYN ║
╠═════════════╬══════╬══════════╬══════════╬══════════╬══════════╣
║ 123-45-6789 ║ 17 ║ 456789 ║ John Doe ║ 05/27/13 ║ Y ║
╠═════════════╬══════╬══════════╬══════════╬══════════╬══════════╣
║ 123-45-6789 ║ 23 ║ 456789 ║ John Doe ║ 08/22/11 ║ N ║
╠═════════════╬══════╬══════════╬══════════╬══════════╬══════════╣
║ 123-45-6789 ║ 1 ║ 456789 ║ John Doe ║ 12/03/07 ║ N ║
╠═════════════╬══════╬══════════╬══════════╬══════════╬══════════╣
║ 999-99-9999 ║ 17 ║ 999999 ║ Jane Doe ║ 05/27/13 ║ Y ║
╠═════════════╬══════╬══════════╬══════════╬══════════╬══════════╣
║ 999-99-9999 ║ 23 ║ 999999 ║ Jane Doe ║ 01/26/09 ║ N ║
╚═════════════╩══════╩══════════╩══════════╩══════════╩══════════╝
Используя следующий код
select distinct p1.SSN, p1.PRCo, p1.Employee, n.FullName, p1.HireDate, p1.ActiveYN,
case when p1.ActiveYN = 'Y' then 'Y'
when p2.ActiveYN = 'Y' then 'Y'
else 'N' end as AnyActiveCo
from PREH as p1
inner join PREH as p2 on p1.SSN=p2.SSN
left outer join PREHFullName as n on p1.PRCo=n.PRCo and p1.Employee=n.Employee
where p1.PRCo<>p2.PRCo
РЕЗУЛЬТАТЫ; Строки 3 и 5 являются дубликатами и не имеют желаемого результата AnyActiveCo для сотрудника, который был в 3 разных компаниях; однако сотрудники только с 2 компаниями показывают хорошие результаты.
╔═════╦═════════════╦══════╦══════════╦══════════╦══════════╦══════════╦═════════════╗
║ Row ║ SSN ║ PRCo ║ Employee ║ FullName ║ HireDate ║ ActiveYN ║ AnyActiveCo ║
╠═════╬═════════════╬══════╬══════════╬══════════╬══════════╬══════════╬═════════════╣
║ 1 ║ 123-45-6789 ║ 17 ║ 456789 ║ John Doe ║ 05/27/13 ║ Y ║ Y ║
╠═════╬═════════════╬══════╬══════════╬══════════╬══════════╬══════════╬═════════════╣
║ 2 ║ 123-45-6789 ║ 23 ║ 456789 ║ John Doe ║ 08/22/11 ║ N ║ Y ║
╠═════╬═════════════╬══════╬══════════╬══════════╬══════════╬══════════╬═════════════╣
║ 3 ║ 123-45-6789 ║ 23 ║ 456789 ║ John Doe ║ 08/22/11 ║ N ║ N ║
╠═════╬═════════════╬══════╬══════════╬══════════╬══════════╬══════════╬═════════════╣
║ 4 ║ 123-45-6789 ║ 1 ║ 456789 ║ John Doe ║ 12/03/07 ║ N ║ Y ║
╠═════╬═════════════╬══════╬══════════╬══════════╬══════════╬══════════╬═════════════╣
║ 5 ║ 123-45-6789 ║ 1 ║ 456789 ║ John Doe ║ 12/03/07 ║ N ║ N ║
╠═════╬═════════════╬══════╬══════════╬══════════╬══════════╬══════════╬═════════════╣
║ 6 ║ 999-99-9999 ║ 17 ║ 999999 ║ Jane Doe ║ 05/27/13 ║ Y ║ Y ║
╠═════╬═════════════╬══════╬══════════╬══════════╬══════════╬══════════╬═════════════╣
║ 7 ║ 999-99-9999 ║ 23 ║ 999999 ║ Jane Doe ║ 01/26/09 ║ N ║ Y ║
╚═════╩═════════════╩══════╩══════════╩══════════╩══════════╩══════════╩═════════════╝
Комментарии:
1.
distinct
применяется ко всей строке. это не различие для каждого поля.select distinct a,b,c
это (в некоторой степени, но не совсем) то же самое, что иselect a,b,c ... group by a,b,c
2. Мы понятия не имеем, поскольку мы не знаем структуры ваших таблиц и то, что хранится в каждом из столбцов. Но, по-видимому, если
HireDate
они уникальны для каждой из компаний, вы не избавитесь от дубликатов с помощью простогоdistinct
.3. добавлены лучшие образцы и результирующие данные