मैं पेड़ प्रजनन परियोजना के लिए एक रैखिक वंश सूची बनाना चाहता हूं। माता-पिता पुरुष/महिला है कि संबंधित नहीं किया जाना चाहिए (कोई आंतरिक प्रजनन) पर नज़र रखने और इन वंशावली कल्पना करने के लिए जोड़े, इसलिए महत्व रहे हैं ...पोस्टग्रेएसक्यूएल 2 अभिभावक/बाल तालिकाओं के माध्यम से रिकर्सिव
नीचे परीक्षण तालिकाओं/Postgresql 9.1 का उपयोग कर डेटा है:
DROP TABLE if exists family CASCADE;
DROP TABLE if exists plant CASCADE;
CREATE TABLE family (
id serial,
family_key VARCHAR(20) UNIQUE,
female_plant_id INTEGER NOT NULL DEFAULT 1,
male_plant_id INTEGER NOT NULL DEFAULT 1,
filial_n INTEGER NOT NULL DEFAULT -1, -- eg 0,1,2... Which would represent None, F1, F2...
CONSTRAINT family_pk PRIMARY KEY (id)
);
CREATE TABLE plant (
id serial,
plant_key VARCHAR(20) UNIQUE,
id_family INTEGER NOT NULL,
CONSTRAINT plant_pk PRIMARY KEY (id),
CONSTRAINT plant_id_family_fk FOREIGN KEY(id_family) REFERENCES family(id) -- temp may need to remove constraint...
);
-- FAMILY Table DATA:
insert into family (id, family_key, female_plant_id, male_plant_id, filial_n) VALUES (1,'NA',1,1,1); -- Default place holder record
-- Root level Alba families
insert into family (id, family_key, female_plant_id, male_plant_id, filial_n) VALUES (2,'family1AA',2,3,1);
insert into family (id, family_key, female_plant_id, male_plant_id, filial_n) VALUES (3,'family2AA',4,5,1);
insert into family (id, family_key, female_plant_id, male_plant_id, filial_n) VALUES (4,'family3AA',6,7,1);
-- F2 Hybrid Families
insert into family (id, family_key, female_plant_id, male_plant_id, filial_n) VALUES (5,'family4AE',8,11,0);
insert into family (id, family_key, female_plant_id, male_plant_id, filial_n) VALUES (6,'family5AG',9,12,0);
insert into family (id, family_key, female_plant_id, male_plant_id, filial_n) VALUES (7,'family6AT',10,13,0);
-- F3 Double Hybrid family:
insert into family (id, family_key, female_plant_id, male_plant_id, filial_n) VALUES (9,'family7AEAG',14,15,0);
-- F3 Tri-hybrid backcross family:
insert into family (id, family_key, female_plant_id, male_plant_id, filial_n) VALUES (10,'family8AEAGAT',17,16,0);
-- PLANT Table DATA:
-- Root level Alba Parents:
insert into plant (id, plant_key, id_family) VALUES (1,'NA',1); -- Default place holder record
insert into plant (id, plant_key, id_family) VALUES (2,'female1A',1);
insert into plant (id, plant_key, id_family) VALUES (3,'male1A',1);
insert into plant (id, plant_key, id_family) VALUES (4,'female2A',1);
insert into plant (id, plant_key, id_family) VALUES (5,'male2A',1);
insert into plant (id, plant_key, id_family) VALUES (6,'female3A',1);
insert into plant (id, plant_key, id_family) VALUES (7,'male3A',1);
-- Female Alba progeny:
insert into plant (id, plant_key, id_family) VALUES (8,'female4A',2);
insert into plant (id, plant_key, id_family) VALUES (9,'female5A',3);
insert into plant (id, plant_key, id_family) VALUES (10,'female6A',4);
-- Male Aspen Root level parents:
insert into plant (id, plant_key, id_family) VALUES (11,'male1E',1);
insert into plant (id, plant_key, id_family) VALUES (12,'male1G',1);
insert into plant (id, plant_key, id_family) VALUES (13,'female1T',1);
-- F1 Hybrid progeny:
insert into plant (id, plant_key, id_family) VALUES (14,'female1AE',5);
insert into plant (id, plant_key, id_family) VALUES (15,'male1AG',6);
insert into plant (id, plant_key, id_family) VALUES (16,'male1AT',7);
-- Hybrid progeny
insert into plant (id, plant_key, id_family) VALUES (17,'female1AEAG',9);
-- Tri-hybrid backcross progeny:
insert into plant (id, plant_key, id_family) VALUES (18,'female1AEAGAT',10);
insert into plant (id, plant_key, id_family) VALUES (19,'female2AEAGAT',10);
नीचे पुनरावर्ती पूछताछ कि मैं Postgres WITH Queries प्रलेखन से प्राप्त होता है:
WITH RECURSIVE search_tree(
family_key
, female_plant
, male_plant
, depth
, path
, cycle
) AS (
SELECT
f.family_key
, pf.plant_key
, pm.plant_key
, 1
, ARRAY[ROW(pf.plant_key, pm.plant_key)]
, false
FROM
family f
, plant pf
, plant pm
WHERE
f.female_plant_id = pf.id
AND f.male_plant_id = pm.id
AND f.filial_n = 1 -- Include only F1 families (root level)
AND f.id <> 1 -- omit the default first family record
UNION ALL
SELECT
f.family_key
, pf.plant_key
, pm.plant_key
, st.depth + 1
, path || ROW(pf.plant_key, pm.plant_key)
, ROW(pf.plant_key, pm.plant_key) = ANY(path)
FROM
family f
, plant pf
, plant pm
, search_tree st
WHERE
f.female_plant_id = pf.id
AND f.male_plant_id = pm.id
AND f.family_key = st.family_key
AND pf.plant_key = st.female_plant
AND pm.plant_key = st.male_plant
AND f.filial_n <> 1 -- Include only non-F1 families (non-root levels)
AND NOT cycle
)
SELECT * FROM search_tree;
नीचे वांछित आउटपुट है:
F1 family1AA=(female1A x male1A) > F2 family4AE=(female4A x male1E) > F3 family7AEAG=(female1AE x male1AG) > F4 family8AEAGAT=(female1AEAG x male1AT)
F1 family2AA=(female2A x male2A) > F2 family5AG=(female5A x male1G) > F3 family7AEAG=(female1AE x male1AG) > F4 family8AEAGAT=(female1AEAG x male1AT)
F1 family3AA=(female3A x male3A) > F2 family6AT=(female6A x female1T) > F3 family8AEAGAT=(female1AEAG x male1AT)
उपर्युक्त रिकर्सिव क्वेरी उपयुक्त एफ 1 माता-पिता के साथ 3 पंक्तियां प्रदर्शित करती है लेकिन पथ डाउनस्ट्रीम परिवार/माता-पिता को प्रदर्शित नहीं करता है। मैं ऊपर सूचीबद्ध वांछित आउटपुट के समान रिकर्सिव आउटपुट बनाने में मदद की सराहना करता हूं।
अच्छा सवाल है, बहुत अच्छी तरह से डाल दिया। बहुत पूरा मैं इस पर काम कर रहा हूं ... – wildplasser
मुझे यकीन नहीं है कि मैं समझता हूं कि पदानुक्रम कैसे परिभाषित किया गया है। मुझे उदाहरण सारणी में अभिभावक/बाल संबंध नहीं मिल रहा है। क्या आप इस बारे में कुछ समझ सकते हैं कि अभिभावक (या बच्चा) कैसे पाया जाता है? –
क्या यह संभव है कि 'plant.id = 11' वाली पंक्ति' '_'' family_id' के रूप में होनी चाहिए? –