9.3 या बाद के संस्करण पोस्ट करें
एक LATERAL
शामिल हों!
SELECT p.id, p.name, p.data, f.*
FROM tb_projects p
LEFT JOIN LATERAL fn_getlinkedproject(p.id) f(linked_id, lined_name) ON TRUE;
परिणाम:
id | data | name | linked_id | linked_name
----+--------+--------+-----------+-------------
1 | data_1 | name_1 | 2 | name_2
2 | data_2 | name_2 | 3 | name_3
3 | data_3 | name_3 | 1 | name_1
देखें:
9.2 या पुराने को पोस्ट करें
कई कारणों से नीचा। कॉलम उपनाम संलग्न करना उतना आसान नहीं है। इसके बजाय अन्य परस्पर विरोधी नामों का नाम बदलें:
SELECT p.id AS p_id, p.data AS p_data, p.name AS p_name, (fn_getlinkedproject(p.id)).*
FROM tb_projects p;
परिणाम:
p_id | p_data | p_name | id | name
------+--------+--------+----+--------
1 | data_1 | name_1 | 2 | name_2
2 | data_2 | name_2 | 3 | name_3
3 | data_3 | name_3 | 1 | name_1
नाम बदलें के लिए परिणाम कॉलम, आपको करने होंगे:
SELECT p.id, p.data, p.name
,(fn_getlinkedproject(p.id)).id AS linked_id
,(fn_getlinkedproject(p.id)).name AS linked_name
FROM tb_projects p;
दोनों पुराने समाधान फ़ंक्शन को बार-बार कॉल करने की एक ही (खराब) क्वेरी योजना का समाधान करते हैं।
इससे बचने के लिए, एक सबक्वेरी का उपयोग करें:
SELECT p.id, p.data, p.name
, (p.x).id AS linked_id, (p.x).name AS linked_name
FROM (SELECT *, fn_getlinkedproject(id) AS x FROM tb_projects) p;
आवश्यक कोष्ठक . की नियुक्ति पर ध्यान दें .
मिश्रित प्रकारों के बारे में मैनुअल
पढ़ें ।
डेमो
CREATE TYPE dm_nameid AS (
id int
, name text); -- types simplified for demo
CREATE TABLE tb_projects(
id int
, data text
, name text);
INSERT INTO tb_projects VALUES
(1, 'data_1', 'name_1')
, (2, 'data_2', 'name_2')
, (3, 'data_3', 'name_3');
CREATE function fn_getlinkedproject(integer) -- avoiding CaMeL-case for demo
RETURNS dm_nameid LANGUAGE sql AS
'SELECT id, name FROM tb_projects WHERE id = ($1 % 3) + 1';
db<>fiddle यहां