Я бы пытался выбрать значения на основе пользовательской иерархии.Эта иерархия не хранится в системе.
пример иерархии: Общие> Основные> Новобранец
Таблица уровней (не обязательно в порядке!)
+-----------+------------+
| ContactID | CategoryID |
+-----------+------------+
| 1 | Recruit |
| 1 | Major |
| 2 | Recruit |
| 3 | Major |
| 3 | General |
| 3 | Recruit |
+-----------+------------+
Вывод:
+-----------+------------+
| ContactID | CategoryID |
+-----------+------------+
| 1 | Major |
| 2 | Recruit |
| 3 | General |
+-----------+------------+
работаетПример подхода:
select ContactID,
case
when "General" in (select CategoryID from Level l1 where l.ContactID = l1.ContactID) then "General"
when "Major" in (select CategoryID from Level l1 where l.ContactID = l1.ContactID) then "Major"
when "Recruit" in (select CategoryID from Level l1 where l.ContactID = l1.ContactID) then "Recruit"
from Level l
Есть ли более эффективный способ сделать это?Фактические данные имеют 30 уровней в иерархии и множество записей.
Использование Microsoft SQL-Server,
Спасибо
РЕДАКТИРОВАТЬ: (спасибо запомогите!) Идеальным решением будет также исключить записи, которые не включены в определенную иерархию.
Например, нам не нужно отображать пользователя 5, так как у него нет действительных категорий, а пользователя 4 следует указать как Recruit.
+-----------+------------+
| ContactID | CategoryID |
+-----------+------------+
| 1 | Recruit |
| 1 | Major |
| 2 | Recruit |
| 3 | Major |
| 3 | General |
| 4 | Chef |
| 4 | Matron |
| 4 | Recruit |
| 5 | Paratrooper|
+-----------+------------+
приводит к
+-----------+------------+
| ContactID | CategoryID |
+-----------+------------+
| 1 | Major |
| 2 | Recruit |
| 3 | General |
| 4 | Recruit |
+-----------+------------+