WHERE Заявление о рекурсивном CTE-запросе для получения всех родителей дочернего узла - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть следующий набор данных, который в основном является деревом, к которому принадлежат все узлы:

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 подмножеством таблицы?
  • Как мне достичь желаемого результата?
...