не в состоянии понять выполнение столбца sortpath в этом коде SQL - PullRequest
0 голосов
/ 28 сентября 2018
CREATE FUNCTION dbo.GetSubtree(@mgr AS INT, @maxlevels AS INT = NULL)
  RETURNS TABLE
  WITH SCHEMABINDING
  AS
   RETURN
    WITH EmpsCTE AS
      (
       SELECT empid, CAST(NULL AS INT) AS mgrid, empname, salary, 0 as lvl,
           CAST(‘.’ AS VARCHAR(900)) AS sortpath
           FROM dbo.Employees
            WHERE empid = @mgr
  UNION ALL
   SELECT S.empid, S.mgrid, S.empname, S.salary, M.lvl + 1 AS lvl,
      CAST(M.sortpath + CAST(S.empid AS VARCHAR(10)) + ‘.’ AS VARCHAR(900)) 
      AS sortpath
         FROM EmpsCTE AS M
          INNER JOIN dbo.Employees AS S
            ON S.mgrid = M.empid
           AND (M.lvl < @maxlevels OR @maxlevels IS NULL)
            )
            SELECT empid, mgrid, empname, salary, lvl, sortpath
             FROM EmpsCTE;

Это моя функция на SQL-сервере, но когда я выполняю это, используя запрос ниже, я не могу понять вывод столбца sortpath

SELECT empid, REPLICATE(‘ | ‘, lvl) + empname AS emp,
        mgrid, salary, lvl, sortpath
       FROM dbo.GetSubtree(3, NULL) AS T
        ORDER BY sortpath;

, тогда вывод

empid empname        mgrid  salary   lvl sortpath
------ ----------------- ------ -------- ---- -----------
  3     Ina           NULL  7500.00   0     .
  7     | Aaron       3     5000.00   1     .7.
  11    | | Gabriel   7     3000.00   2     .7.11.
  9     | | Rita      7     3000.00   2     .7.9.
  12    | | | Emilia  9     2000.00   3     .7.9.12.
  13    | | | Michael 9     2000.00   3     .7.9.13.
  14    | | | Didi    9     1500.00   3     .7.9.14.

теперь, с моей точки зрения, строка, в которой есть empid 11, должна иметь только .11.Отпуск sortpath может кто-нибудь мне с этим исполнением

1 Ответ

0 голосов
/ 28 сентября 2018

с моей точки зрения, строка, у которой есть empid 11, должна иметь только .11.otput из sortpath

Почему вы так думаете?Каждый сотрудник присоединяется к своему менеджеру и дополняет его sortpath своим идентификатором сотрудника и ..Так как менеджер 11 - 7, а путь сортировки 7 - .7., почему вы не ожидаете, что 7 будет там?

Если это, как следует из его названия, предназначеночтобы использовать для сортировки, я бы использовал / в качестве разделителей вместо ..Я также включил бы id менеджера высшего уровня в их путь сортировки, и, наконец, я бы преобразовал этот столбец в hierarchyid в окончательном выводе функции.Затем будет правильно отсортирована /3/7/11/ после /3/7/9/ (в отличие от вашего вывода), поскольку она не зависит только от лексикографического порядка сортировки.

, например:

CREATE FUNCTION dbo.GetSubtree(@mgr AS INT, @maxlevels AS INT = NULL)
  RETURNS TABLE
  WITH SCHEMABINDING
  AS
   RETURN
    WITH EmpsCTE AS
      (
       SELECT empid, CAST(NULL AS INT) AS mgrid, empname, salary, 0 as lvl,
           CAST('/' + s.empid + '/' AS VARCHAR(900)) AS sortpath
           FROM dbo.Employees
            WHERE empid = @mgr
  UNION ALL
   SELECT S.empid, S.mgrid, S.empname, S.salary, M.lvl + 1 AS lvl,
      CAST(M.sortpath + CAST(S.empid AS VARCHAR(10)) + '/' AS VARCHAR(900)) 
      AS sortpath
         FROM EmpsCTE AS M
          INNER JOIN dbo.Employees AS S
            ON S.mgrid = M.empid
           AND (M.lvl < @maxlevels OR @maxlevels IS NULL)
            )
            SELECT empid, mgrid, empname, salary, lvl,
               CAST(sortpath as hierarchyid) as sortpath
             FROM EmpsCTE;
...