У меня есть следующий набор данных, который в основном является деревом, к которому принадлежат все узлы:
name |id |parent_id
Planet Earth |1 |0
North America|2 |1
Costa Rica |46408|2
Alajuela |46409|46408
Cartago |46410|46408
Guanacaste |46411|46408
Heredia |46412|46408
...
Я хочу иметь возможность запрашивать, чтобы получить все нижние узлы в дереве, следующий запрос отлично подходит для этого:
SELECT *
FROM locations l
WHERE l.id NOT IN (SELECT parent_id FROM locations)
AND l.name LIKE ?
Я хочу вывести данные в следующем формате:
запрос
SELECT *
FROM locations l
WHERE l.id NOT IN (SELECT parent_id FROM locations)
AND l.name LIKE 'he%'
SPOOKY SQL MAGIC GOES HERE...
выход
name |id |parent_id|parents
Heredia|46412|46408 |Planet Earth > North America > Costa Rica
Я сам начал работать над запросом, как показано ниже:
WITH CTE AS (
SELECT id, parent_id, name, CONVERT(VARCHAR(MAX),name) AS parents
FROM locations
WHERE idParent = 0
UNION ALL
SELECT l.id, l.parent_id, l.name, c.parents + ' > ' + CONVERT(VARCHAR(MAX),t.name) AS parents
FROM locations l
INNER JOIN CTE c ON l.idParent = c.id
)
SELECT * FROM CTE
Как вы можете видеть, я использую рекурсию с выражениями Common Table, но я не могу понять, как объединить два запроса. Также приведенный выше запрос выполняется для всей таблицы.
- Как я могу ограничить вышеуказанный запрос CTE подмножеством таблицы?
- Как мне достичь желаемого результата?