Как выполнить цикл в подзапросе MSSQL

Подскажите, как правильно реализовать такое? Есть таблица:

OwnerId objId
1 2
1 3
2 25
2 46
3 33

Т.е. в одной таблице хранятся данные, которые имеют как бы координаты в каком порядке им отображаться, objId может быть ownerId для другого элемента таблицы. Получается в виде вот такого:

  • 1
    • 2
      • 25
      • 46
    • 3
      • 33

Я делал селект к самому минимальному значению ownerID - получал это значение, и потом в цикле перебирал и выводил все значения "where OwnerId = полученному objID", т.е. что-то вроде вывода древа элементов с дочерними элементами код на php получился очень громоздким. Можно ли как-то сделать данную процедуру средствами SQL?


Ответы (1 шт):

Автор решения: Akina

Пример для MySQL.

CREATE TABLE test (OwnerId INT, objId INT);
INSERT INTO test VALUES
(1, 2),
(1, 3),
(2, 25),
(2, 46),
(3, 33);
WITH RECURSIVE cte (id, path, level) AS (
  SELECT DISTINCT 
         OwnerId, CAST(OwnerId AS CHAR(65535)), 0
  FROM test t1
  WHERE NOT EXISTS (
    SELECT NULL
    FROM test t2
    WHERE t1.OwnerId = t2.objId
    )
  UNION ALL 
  SELECT test.objId, CONCAT_WS('.', cte.path, test.objId), cte.level + 1
  FROM cte
  JOIN test ON cte.id = test.OwnerId
  )
SELECT CONCAT(REPEAT('...', level), id) node -- выпендрёж, конечно...
-- SELECT id node
FROM cte
ORDER BY path
node
1
...2
......25
......46
...3
......33

fiddle

→ Ссылка