Как я могу выразить PostgreSQL, что я хочу значения одновременно из нескольких иерархических уровней в запросе XPath ?
У меня есть документ (в значении PostgreSQL XML
) со значениеммногоуровневая иерархия.Для этого вопроса может быть создан пример с:
SELECT XMLPARSE(DOCUMENT '
<parrots>
<parrot name="Fred">
<descriptor>Beautiful plumage</descriptor>
<descriptor>Resting</descriptor>
</parrot>
<parrot name="Ethel">
<descriptor>Pining for the fjords</descriptor>
<descriptor>Stunned</descriptor>
</parrot>
</parrots>
') AS document
INTO TEMPORARY TABLE parrot_xml;
Я могу получить разные уровни информации из этого документа.
=> SELECT
(XPATH('./@name', parrot.node))[1] AS name
FROM (
SELECT
UNNEST(XPATH('./parrot', parrot_xml.document))
AS node
FROM parrot_xml
) AS parrot
;
name
-------
Fred
Ethel
(2 rows)
=> SELECT
(XPATH('./text()', descriptor.node))[1] AS descriptor
FROM (
SELECT
UNNEST(XPATH('./parrot/descriptor', parrot_xml.document))
AS node
FROM parrot_xml
) AS descriptor
;
descriptor
-----------------------
Beautiful plumage
Resting
Pining for the fjords
Stunned
(4 rows)
Что я не могу понять, хотя,Как соединить несколько уровней, чтобы запрос возвращал каждый дескриптор, связанный с попугаем, к которому он применяется.
=> SELECT
??? AS name,
??? AS descriptor
FROM
???
;
name descriptor
------- -----------------------
Fred Beautiful plumage
Fred Resting
Ethel Pining for the fjords
Ethel Stunned
(4 rows)
Как это можно сделать?Что должно идти вместо «???
»?
Один сложный запрос XPath - но как обращаться к нескольким уровням одновременно?Несколько запросов XPath - но тогда как информация предка-потомка сохраняется для результирующего отношения?Что-то еще?