Как выполнить цикл в подзапросе 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 |