sql 2008 удаляет дубликаты из внутреннего соединения

#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-678917456789   ║ John Doe ║ 05/27/13 ║ Y        ║
╠═════════════╬══════╬══════════╬══════════╬══════════╬══════════╣
║ 123-45-678923456789   ║ John Doe ║ 08/22/11 ║ N        ║
╠═════════════╬══════╬══════════╬══════════╬══════════╬══════════╣
║ 123-45-67891456789   ║ John Doe ║ 12/03/07 ║ N        ║
╠═════════════╬══════╬══════════╬══════════╬══════════╬══════════╣
║ 999-99-999917999999   ║ Jane Doe ║ 05/27/13 ║ Y        ║
╠═════════════╬══════╬══════════╬══════════╬══════════╬══════════╣
║ 999-99-999923999999   ║ 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 ║
╠═════╬═════════════╬══════╬══════════╬══════════╬══════════╬══════════╬═════════════╣
║ 1123-45-678917456789   ║ John Doe ║ 05/27/13 ║ Y        ║ Y           ║
╠═════╬═════════════╬══════╬══════════╬══════════╬══════════╬══════════╬═════════════╣
║ 2123-45-678923456789   ║ John Doe ║ 08/22/11 ║ N        ║ Y           ║
╠═════╬═════════════╬══════╬══════════╬══════════╬══════════╬══════════╬═════════════╣
║ 3123-45-678923456789   ║ John Doe ║ 08/22/11 ║ N        ║ N           ║
╠═════╬═════════════╬══════╬══════════╬══════════╬══════════╬══════════╬═════════════╣
║ 4123-45-67891456789   ║ John Doe ║ 12/03/07 ║ N        ║ Y           ║
╠═════╬═════════════╬══════╬══════════╬══════════╬══════════╬══════════╬═════════════╣
║ 5123-45-67891456789   ║ John Doe ║ 12/03/07 ║ N        ║ N           ║
╠═════╬═════════════╬══════╬══════════╬══════════╬══════════╬══════════╬═════════════╣
║ 6999-99-999917999999   ║ Jane Doe ║ 05/27/13 ║ Y        ║ Y           ║
╠═════╬═════════════╬══════╬══════════╬══════════╬══════════╬══════════╬═════════════╣
║ 7999-99-999923999999   ║ 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. добавлены лучшие образцы и результирующие данные