Ваши требования могут быть неполными, если сотруднику разрешено иметь более одного номера телефона для данного типа телефона.Я добавил phone_number_id только для того, чтобы сделать вещи уникальными, и предположил, что вам нужен самый низкий идентификатор, если у человека есть два телефона одного типа.Это довольно произвольно, но вы можете заменить его своей собственной бизнес-логикой.
Я также предположил, что существует какая-то таблица Phone_Types, которая включает ваш приоритет, для которого должен использоваться номер телефона.Если у вас еще нет этой таблицы, вам, вероятно, следует добавить ее.Если ничего другого, это позволяет вам ограничивать типы телефонов с помощью внешнего ключа.
SELECT
PN1.employee_id,
PN1.phone_type,
PN1.phone_number
FROM
Phone_Numbers PN1
INNER JOIN Phone_Types PT1 ON
PT1.phone_type = PN1.phone_type
WHERE
NOT EXISTS
(
SELECT *
FROM
Phone_Numbers PN2
INNER JOIN Phone_Types PT2 ON
PT2.phone_type = PN2.phone_type AND
(
(PT2.priority < PT1.priority)
--OR (PT2.priority = PT1.priority AND PN2.phone_number_id > PN1.phone_number_id)
)
)
Вы можете также реализовать это с помощью LEFT JOIN вместо NOT EXISTS, или вы можете использовать TOP, если вы ищетеномер телефона для одного сотрудника.Просто сделайте приоритет TOP 1 ORDER BY, phone_number_id.
Наконец, если вы хотите перейти на SQL 2005 или SQL 2008, вы можете использовать CTE с ROWNUMBER () OVER (приоритет ORDER BY, phone_number, PARTITIONBY employee_id) <- я думаю, что мой синтаксис может быть немного не таким, как в скобках, но, надеюсь, он достаточно понятен.Это позволит вам получить лучшую оценку для всех сотрудников, проверив, что ROWNUMBER () = 1. </p>