मान लेते हैं कि आपके पास एक nodes
टेबल है:
CREATE TABLE nodes
(
node serial PRIMARY KEY,
parent integer NULL REFERENCES nodes(node),
ts timestamp NOT NULL DEFAULT now()
);
यह शीर्ष पर रूट नोड्स के साथ एक मानक नोड जैसी वृक्ष संरचना का प्रतिनिधित्व करता है और कई बच्चे नोड्स रूट नोड्स या अन्य बच्चे नोड्स से झूलते हैं।
आइए एक दो उदाहरण मान डालें:
INSERT INTO nodes (parent)
VALUES (NULL), (NULL), (NULL), (NULL), (1), (1), (1), (1), (6), (1)
, (6), (9), (6), (6), (3), (3), (3), (15);
अब मैं पहले 10 रूट नोड्स और उनके सभी बच्चों को 4 की गहराई तक पुनः प्राप्त करना चाहता हूं:
WITH RECURSIVE node_rec AS
(
(SELECT 1 AS depth, * FROM nodes WHERE parent IS NULL LIMIT 10)
UNION ALL
SELECT depth + 1, n.*
FROM nodes AS n JOIN node_rec ON (n.parent = node_rec.node)
WHERE depth < 4
)
SELECT * FROM node_rec;
यह बहुत अच्छा काम करता है और मुझे निम्नलिखित परिणाम देता है:
depth | node | parent
-------+------+--------
1 | 1 |
1 | 2 |
1 | 3 |
1 | 4 |
2 | 5 | 1
2 | 6 | 1
2 | 7 | 1
2 | 8 | 1
2 | 10 | 1
2 | 15 | 3
2 | 16 | 3
2 | 17 | 3
3 | 9 | 6
3 | 11 | 6
3 | 13 | 6
3 | 14 | 6
3 | 18 | 15
4 | 12 | 9
जैसा कि आपने देखा होगा, कोई ORDER BY
खंड नहीं है, इसलिए आदेश परिभाषित नहीं है। आप यहाँ जो क्रम देख रहे हैं वह रूट नोड्स से लेकर गहरे नोड्स तक है।
जैसा कि आप नीचे दिए गए उदाहरण के चित्र से देख सकते हैं, मैं परिणामों को कैसे आदेश दूंगा कि वे एक विस्तारित वृक्ष दृश्य में दिखाई देंगे?
मैं मूल रूप से चाहता हूं कि बच्चे को उनके संबंधित माता-पिता के नोड के ठीक बाद रखा जाए। यदि दो या दो से अधिक बच्चे के नोड्स में एक ही मूल नोड है, तो मैं चाहता हूं कि उन्हें उनके टाइमस्टैम्प द्वारा हल किया जाए। उपरोक्त उदाहरण के आधार पर, यहां वांछित उत्पादन क्रम है जिसे मैं प्राप्त करने की कोशिश कर रहा हूं:
depth | node | parent | ts
-------+------+--------+---------
1 | 1 | | 2014-01-01 00:00:00
2 | 5 | 1 | 2014-01-01 00:10:00
2 | 6 | 1 | 2014-01-01 00:20:00
3 | 9 | 6 | 2014-01-01 00:25:00
4 | 12 | 9 | 2014-01-01 00:27:00
3 | 11 | 6 | 2014-01-01 00:26:00
3 | 13 | 6 | 2014-01-01 00:30:00
3 | 14 | 6 | 2014-01-01 00:36:00
2 | 7 | 1 | 2014-01-01 00:21:00
2 | 8 | 1 | 2014-01-01 00:22:00
2 | 10 | 1 | 2014-01-01 00:23:00
1 | 2 | | 2014-01-01 00:08:00
1 | 3 | | 2014-01-01 00:09:00
2 | 15 | 3 | 2014-01-01 10:00:00
3 | 18 | 15 | 2014-01-01 11:05:00
2 | 16 | 3 | 2014-01-01 11:00:00
2 | 17 | 3 | 2014-01-01 12:00:00
1 | 4 | | 2014-01-01 00:10:00
depth
कॉलम कहां से आता है? मैं इसे प्रारंभिक तालिका संरचना में नहीं देखता हूं।