Получить набор результатов из той же таблицы для дерева - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь реализовать древовидное представление, получая данные из следующей таблицы, все следующие идентификаторы - varchars:

     user_id   name  R_id R_name  mgr_id   mgr_name
     ----------------------------------------------
     61        a     64    c       65       b
     62        a     66    c       65       b
     63        b     64    c       65       b
     64        c     65    b       65       b
     65        b     NULL  NULL    NULL     NULL
     66        c     65    b       65       b

R_id, mgr_id - по очереди столбцы в одной и той же таблице. Теперь я хотел бы получить следующий набор результатов:

   user_id      name     Parent
   ----------------------------
   65           b         NULL
   66           c         65
   64           c         65
   63           b         64
   62           a         66
   61           a         64

Это запрос, который я использую, но он кажется немного сложным, я уверен, что должен быть более простой способ справиться с этим:

    CREATE TABLE #DT
   (
    user_id VARCHAR(10),
    name VARCHAR(100),
    parent VARCHAR(10)
   )

INSERT INTO #DT
SELECT DISTINCT 
    mgr_id as user_id,
    mgr_name as name ,
    NULL AS parent 
FROM 
    Users

INSERT INTO #DT
SELECT DISTINCT 
    user_id as user_id,
    name as name ,
    mgr_id AS parent   
FROM
    Users

INSERT INTO #DT
SELECT DISTINCT
    mgr_id as user_id,
    mgr_name as name ,
    R_id AS parent 
FROM
    Users

SELECT  * FROM #DT

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Ваш исходный запрос возвращает дубликаты, так как DISTINCT применяется только к каждому запросу, а не к общему результату. Если это важно для вас, вы можете использовать ( DEMO )

SELECT v.user_id,
       v.name,
       v.parent
FROM   users
       CROSS apply (VALUES (1,mgr_id,mgr_name,NULL),
                           (2,user_id,name,mgr_id),
                           (3,mgr_id,mgr_name, R_id) ) v(source, user_id, name, parent)
GROUP  BY v.source,
          v.user_id,
          v.name,
          v.parent 

В противном случае более простая версия, которая удаляет их,

SELECT DISTINCT v.user_id,
                v.name,
                v.parent
FROM   users
       CROSS apply (VALUES (mgr_id,mgr_name,NULL),
                           (user_id,name,mgr_id),
                           (mgr_id,mgr_name, R_id) ) v(user_id, name, parent)
0 голосов
/ 04 ноября 2018

Используйте UNION для этого. UNION уже эффективно применяет SELECT DISTINCT по умолчанию. Вам также нужно только применить псевдонимы столбцов к первому оператору SELECT.

SELECT mgr_id AS user_id, mgr_name AS name, NULL AS parent FROM Users
UNION
SELECT user_id, name, mgr_id FROM Users
UNION
SELECT mgr_id, mgr_name, R_id FROM Users
...