मैं इस सवाल की सराहना करता हूं कि यह सवाल कुछ साल पुराना है, लेकिन मैं यहां इसी तरह की समस्या के साथ आया हूं और मुझे विश्वास है कि मुझे इसका जवाब मिल गया है।
with x as (select
'<catalog catalog-id="manufacturer-catalog-id">
<category-assignment category-id="category1" product-id="product1"/>
<category-assignment category-id="category1" product-id="product2"/>
<category-assignment category-id="category2" product-id="product3"/>
</catalog>'::xml as t
)
(
select
xpath('/catalog/@catalog-id', cat_node) catalog_id,
xpath('/category-assignment/@category-id', cat_assn_list) category_id,
xpath('/category-assignment/@product-id', cat_assn_list) product_id
from (select unnest(xpath('/catalog/category-assignment', t)) cat_assn_list, t cat_node from x) q
);
यह देता है
catalog_id | category_id | product_id
---------------------------+-------------+------------
{manufacturer-catalog-id} | {category1} | {product1}
{manufacturer-catalog-id} | {category1} | {product2}
{manufacturer-catalog-id} | {category2} | {product3}
(3 rows)
यह मूल रूप से आधार चयन करता है जो दो कॉलम 1 देता है) एक xpath असाइनमेंट सूची (एकाधिक पंक्तियां) और 2) मूल श्रेणी नोड प्राप्त करने के लिए। लौटाई गई पंक्तियों को तब उच्च स्तरीय xpath कथनों द्वारा काम किया जाता है - पूर्ण श्रेणी नोड कॉलम से श्रेणी-आईडी और कॉलम स्तर xpaths असाइनमेंट सूची आइटम में।
मेरा मानना है कि ओपी का मुद्दा यह था कि इसे पूरी तरह से एकल असाइनमेंट सूची कॉलम से चलाने का मतलब है कि, चूंकि पोस्टग्रेज़ एक ही डोम में पॉइंटर्स की बजाय उचित स्तर पर एक्सएमएल नोडसेट लौटा रहा है, इसके द्वारा लौटाया गया एक्सएमएल आउटपुट कैटलॉग स्तर से नीचे है और कि xml ndoeset को ऊपर की ओर ट्रैवर्स नहीं किया जा सकता है उदा। "पूर्वज ::" के साथ।
आशा है कि यह किसी और की मदद करता है।
संपादित करें - मैं इसके प्रदर्शन पर टिप्पणी नहीं कर सकता, क्योंकि मेरा मानना है कि कैटलॉग-आईडी xpath समान कैटलॉग नोड के भीतर प्रत्येक असाइनमेंट पंक्ति के लिए दोहराया जाएगा।