Мне нужно создать и применить иерархию к клиентам, где у меня нет контроля над таблицей клиентов или ее базой данных.
Для этого я создаю отдельную базу данных, которая будет содержать виртуальных клиентов икартографический стол.
Существуют другие процессы, которые возьмут результаты этого сценария и применят его к клиентам из неконтролируемой базы данных.
Таблица VirtualCustomer - я могу контролироватьэтот дизайн таблицы.
Эти «клиенты» представляют иерархию, которая должна быть применена.
VirCustID | ParentVirCustID | Name
2001 | NULL | Vehicle
2002 | 2001 | Car
2003 | NULL | Tech
2004 | 2003 | Comms
HierarchyAssignment Table - У меня есть контроль над этим дизайном таблицы
Использование этой таблицы в качестве механизма присоединения клиента к виртуальному клиенту.Виртуальный клиент будет иметь оставшуюся часть иерархии.
Важно Я сопоставляю CustID с самым низким уровнем иерархии, поэтому необходимо выполнить возврат снизу вверх.
CustID - это идентификатор клиента за пределами этой базы данных, который я не могу контролировать.Мне также не нужно присоединяться к этому столу.
CustID | VirCustID
1001 | 2001
1002 | 2001
1003 | 2003
Я пытаюсь получить результат:
CustID | L1ID | L1Name | L2ID | L2Name
1001 | 2001 | Vehicle | 2002 | Car
1002 | 2001 | Vehicle | 2002 | Car
1003 | 2003 | Tech | 2004 | Comms
1004 | NULL | NULL | NULL | NULL
На данный момент меня интересуют только 2 уровня, хотя возможно, мне нужно увеличить это, следовательно, используякартографический стол.Мне нужно иметь возможность поддерживать L n ID и имя.
Я думаю, что мне нужна рекурсия CTE и, возможно, поворот, и я попытался сделать несколько вещей, которые я собрал вместе из других вопросов и ответовхотя пока ничего не получилось.
Это один из сценариев, с которыми я играл.Я просто не знаю, с чего еще начать, и любые советы будут с благодарностью приняты.
WITH cp AS
(
SELECT p.VirCustID, p.parentVirCustID, 0 as [level]
FROM VirtualCustomer as p
WHERE p.parentVirCustIDis null
UNION ALL
SELECT p2.VirCustID, p2.parentVirtualId, c.[level]+1
FROM VirtualCustomer as p2
JOIN cp as c on p2.parentVirCustID= c.VirtCustID
)
select * from cp