/ / PostgreSQL ltree किसी दिए गए लेबल के सभी पूर्वजों को खोजें (पथ नहीं)

PostgreSQL ltree किसी दिए गए लेबल के सभी पूर्वजों को खोजता है (पथ नहीं) - sql, postgresql, lreeree

मेरे पास एक लेट्री पथ स्तंभ के साथ एक तालिका है। मेरी पदानुक्रम में एक लेबल का मार्ग अद्वितीय है, जिसका अर्थ है कि हर लेबल में एक मूल लेबल है। दूसरे शब्दों में, तालिका में दो लेट्री पथ नहीं हैं जो एक ही लेबल के साथ समाप्त होंगे।

मेरे पास एक लेट्री लेबल है, चलो "सी" कहें

मैं निम्नलिखित क्वेरी के साथ इस लेबल की सभी वंशज पंक्तियाँ पा सकता हूँ:

select * from myTree where path ~ "*.C.*";

यह ठीक काम करता है और सही उपशीर्षक देता है।

अब मुझे सभी को खोजने के लिए क्वेरी को लागू करने की आवश्यकता हैइस दिए गए लेबल की पूर्वज पंक्तियाँ। मेरा मतलब है कि अगर उदाहरण में "A", "AB", "ABC" लेबल वाली तालिका में 3 पंक्तियाँ हैं, तो मैं "A" और "AB" पथ के साथ पंक्तियाँ प्राप्त करना चाहूँगा (संभवतः "ABC" सहित, अभी के लिए कोई फर्क नहीं पड़ता)।

अगर मुझे उपरोक्त उदाहरण में "C" ("A.B.C") का पूरा रास्ता पता है, तो कार्य आसान है @> ऑपरेटर। हालांकि, अब मैं केवल "सी" जानता हूं, और फिर भी मैं एक क्वेरी के साथ कार्य को प्राप्त करना चाहूंगा। क्या इसे करने का कोई तरीका है?

उत्तर:

उत्तर № 1 के लिए 12
SELECT
*
FROM
myTree
WHERE
path @> (
SELECT
path
FROM
myTree
WHERE
label = "C"
);

जवाब के लिए 0 № 2

कुछ इस तरह:

WITH r AS
(
SELECT *, row_number() OVER (ORDER BY path) rn
FROM myTree
)
SELECT *
FROM r
WHERE rn <= (SELECT rn FROM r WHERE path ~ "*.C");

एसक्यूएल फिडल

हो सकता है कि वहाँ निर्मित सामान का उपयोग कर एक बेहतर तरीका है।