Как я могу получить иерархический XML в T-SQL? - PullRequest
0 голосов
/ 05 ноября 2008

Моя таблица имеет следующую схему:

id, parent_id, текст

Учитывая следующие данные, я хотел бы вернуть иерархию xml:

Данные: (1, ноль, «x»), (2,1, «y»), (3,1, «z»), (4,2, «a»)

XML:
[row text = "x"]
[row text = "y"]
[row text = "a" /]
[/ Строка]
[row text = "z" /]
[/ row]


Добавлено: у иерархии нет максимальной глубины

Ответы [ 2 ]

1 голос
/ 05 ноября 2008

Если у вас конечная глубина, есть быстрое окно, которое выглядит так:

SELECT T.*, T2.*, T3.* /*, ...*/ FROM myTable T 
INNER JOIN myTable T2 ON T2.parent_id=T.id
INNER JOIN myTable T3 ON T3.parent_id=T2.id
/* ... */
WHERE T.parent_id IS NULL
FOR XML AUTO

Я не уверен, но можно было бы придумать аналогичный результат, используя рекурсивные запросы . Конечно, это намного проще (и, вероятно, имеет больше смысла) на уровне приложений.

0 голосов
/ 05 ноября 2008

Для этого требуется «транзитивное замыкание». Вам нужно рекурсивно обработать данные, чтобы найти всех детей, находящихся под данным родителем.

Примерно алгоритм выглядит следующим образом.

for top in cursor( nodes where  each parent==null ):
    build_tree( top )

def build_tree( parent ):
    emit opening tag
    for child in cursor( nodes where parent == parent ):
        build_tree( child )
    emit closing tag

Обратите внимание, что некоторые интерпретаторы SQL могут иметь проблемы с рекурсией - они могут не открывать новый, новый курсор по мере необходимости. Однако каждый курсор должен быть отдельным, поскольку у вас будет столько же открытых курсоров, сколько в вашем дереве уровней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...