เดธเดเตเดเตเตผเดฃเตเดฃเดฎเดพเดฏ ERP เดธเดฟเดธเตเดฑเตเดฑเดเตเดเดณเดฟเตฝ เดชเดฒ เดเดจเตเดฑเดฟเดฑเตเดฑเดฟเดเตพเดเตเดเตเด เดเดฐเต เดถเตเดฐเตเดฃเดฟ เดธเตเดตเดญเดพเดตเดฎเตเดฃเตเดเตเดเดเดคเดพเดจเดฎเดพเดฏ เดตเดธเตเดคเตเดเตเดเตพ เด เดฃเดฟเดจเดฟเดฐเดเตเดเตเดฎเตเดชเตเตพ เดชเตเตผเดตเดฟเดเดฐเตเด เดชเดฟเตปเดเดพเดฎเดฟเดเดณเตเด เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เดฌเดจเตเดงเดคเตเดคเดฟเดจเตเดฑเต เดตเตเดเตเดทเด - เดเดคเดพเดฃเต เดเดจเตเดฑเตผเดชเตเดฐเตเดธเดธเดฟเดจเตเดฑเต เดธเดเดเดเดจเดพ เดเดเดจ (เด เดเดฒเตเดฒเดพ เดถเดพเดเดเดณเตเด เดตเดเตเดชเตเดชเตเดเดณเตเด เดตเตผเดเตเดเต เดเตเดฐเตเดชเตเดชเตเดเดณเตเด), เดเตเดเดพเดคเต เดเดฐเดเตเดเตเดเดณเตเดเต เดเดพเดฑเตเดฑเดฒเตเดเต, เดเตเดฒเดฟเดฏเตเดเต เดฎเตเดเดฒเดเตพ, เดธเตเดฏเดฟเตฝเดธเต เดชเตเดฏเดฟเดจเตเดฑเตเดเดณเตเดเต เดญเตเดฎเดฟเดถเดพเดธเตเดคเตเดฐเด,...
เดตเดพเดธเตเดคเดตเดคเตเดคเดฟเตฝ, เดเดจเตเดจเตเดฎเดฟเดฒเตเดฒ
เด เดคเตเดคเดฐเดฎเตเดฐเต เดฎเดฐเด เดเดฐเต เดกเดฟเดฌเดฟเดเดเดเดธเดฟเตฝ เดธเดเดญเดฐเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดจเดฟเดฐเดตเดงเดฟ เดฎเดพเตผเดเดเตเดเดณเตเดฃเตเดเต, เดเดจเตเดจเดพเตฝ เดเดจเตเดจเต เดเดเตเดเตพ เดเดฐเต เดเดชเตเดทเดจเดฟเตฝ เดฎเดพเดคเตเดฐเด เดถเตเดฐเดฆเตเดง เดเตเดจเตเดฆเตเดฐเตเดเดฐเดฟเดเตเดเตเด:
CREATE TABLE hier(
id
integer
PRIMARY KEY
, pid
integer
REFERENCES hier
, data
json
);
CREATE INDEX ON hier(pid); -- ะฝะต ะทะฐะฑัะฒะฐะตะผ, ััะพ FK ะฝะต ะฟะพะดัะฐะทัะผะตะฒะฐะตั ะฐะฒัะพัะพะทะดะฐะฝะธะต ะธะฝะดะตะบัะฐ, ะฒ ะพัะปะธัะธะต ะพั PK
เดจเดฟเดเตเดเตพ เดถเตเดฐเตเดฃเดฟเดฏเตเดเต เดเดดเดเตเดเดณเดฟเดฒเตเดเตเดเต เดเดฑเตเดฑเตเดจเตเดเตเดเตเดฎเตเดชเตเตพ, เด เดคเตเดคเดฐเดฎเตเดฐเต เดเดเดจเดฏเดฟเตฝ เดจเดฟเดเตเดเดณเตเดเต "เดจเดฟเดทเตโเดเดณเดเตเด" เดฐเตเดคเดฟเดเตพ เดเดคเตเดฐเดคเตเดคเตเดณเด เดซเดฒเดชเตเดฐเดฆเดฎเดพเดเตเดฎเตเดจเตเดจเต เดเดพเดฃเดพเตป เด เดคเต เดเตเดทเดฎเดฏเตเดเต เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต.
เดเดฃเตเดเดพเดเตเดจเตเดจ เดธเดพเดงเดพเดฐเดฃ เดชเตเดฐเดถเตเดจเดเตเดเตพ, SQL-เตฝ เด
เดต เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเดคเต, เด
เดตเดฏเตเดเต เดชเตเดฐเดเดเดจเด เดฎเตเดเตเดเดชเตเดชเตเดเตเดคเตเดคเดพเตป เดถเตเดฐเดฎเดฟเดเตเดเดพเด.
#1. เดฎเตเดฏเดฒเดฟเดจเตเดฑเต เดฆเตเดตเดพเดฐเดคเตเดคเดฟเดจเตเดฑเต เดเดดเด เดเดคเตเดฐเดฏเดพเดฃเต?
เดกเดฟเดชเตเดชเดพเตผเดเตเดเตโเดฎเตเดจเตเดฑเตเดเตพ, เดกเดฟเดตเดฟเดทเดจเตเดเตพ, เดธเตเดเตเดเดฑเตเดเตพ, เดฌเตเดฐเดพเดเตเดเตเดเตพ, เดตเตผเดเตเดเดฟเดเดเต เดเตเดฐเตเดชเตเดชเตเดเตพ ... - เดจเดฟเดเตเดเตพ เด
เดตเดฏเต เดเดจเตเดคเต เดตเดฟเดณเดฟเดเตเดเดพเดฒเตเด, เด เดเดเดจ เดเตผเดเดจเตเดธเตเดทเดจเตเดฑเต เดเดเดจเดฏเดฟเตฝ เดตเดเตเดชเตเดชเตเดเดณเตเดเต เดเตเดดเตเดตเดดเดเตเดเดคเตเดคเต เดชเตเดฐเดคเดฟเดซเดฒเดฟเดชเตเดชเดฟเดเตเดเตเดฎเตเดจเตเดจเต เดจเดฎเตเดเตเดเต เดเดฑเดชเตเดชเดพเดฏเดฟ เด
เดเดเตเดเดฐเดฟเดเตเดเดพเด.
เดเดฆเตเดฏเด, เดจเดฎเตเดเตเดเต 10K เดเดเดเดเตเดเดณเตเดเต 'เดตเตเดเตเดทเด' เดธเตเดทเตเดเดฟเดเตเดเดพเด
INSERT INTO hier
WITH RECURSIVE T AS (
SELECT
1::integer id
, '{1}'::integer[] pids
UNION ALL
SELECT
id + 1
, pids[1:(random() * array_length(pids, 1))::integer] || (id + 1)
FROM
T
WHERE
id < 10000
)
SELECT
pids[array_length(pids, 1)] id
, pids[array_length(pids, 1) - 1] pid
FROM
T;
เดเดฑเตเดฑเดตเตเด เดฒเดณเดฟเดคเดฎเดพเดฏ เดเตเดฒเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฎเตเดเตเดเต เดเดฐเดเดญเดฟเดเตเดเดพเด - เดเดฐเต เดชเตเดฐเดคเตเดฏเตเด เดฎเตเดเดฒเดฏเดฟเตฝ เดเตเดฒเดฟ เดเตเดฏเตเดฏเตเดจเตเดจ เดเดฒเตเดฒเดพ เดเตเดตเดจเดเตเดเดพเดฐเตเดฏเตเด เดเดฃเตเดเตเดคเตเดคเตเด, เด
เดฒเตเดฒเตเดเตเดเดฟเตฝ เดถเตเดฐเตเดฃเดฟเดฏเตเดเต เด
เดเดฟเดธเตเดฅเดพเดจเดคเตเดคเดฟเตฝ - เดเดฐเต เดจเตเดกเดฟเดจเตเดฑเต เดเดฒเตเดฒเดพ เดเตเดเตเดเดฟเดเดณเตเดฏเตเด เดเดฃเตเดเตเดคเตเดคเตเด. เดชเดฟเตปเดเดพเดฎเดฟเดฏเตเดเต "เดเดดเด" เดฒเดญเดฟเดเตเดเตเดจเตเดจเดคเต เดจเดจเตเดจเดพเดฏเดฟเดฐเดฟเดเตเดเตเด ... เดเดคเตเดฒเตเดฒเดพเด เดเดตเดถเตเดฏเดฎเดพเดฏเดฟ เดตเดจเตเดจเตเดเตเดเดพเด, เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดเดคเตเดเตเดเดฟเดฒเตเด เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เดจเดฟเตผเดฎเตเดฎเดพเดฃเดคเตเดคเดฟเดจเต
เด เดชเดฟเตปเดเดพเดฎเดฟเดเดณเตเดเต เดฐเดฃเตเดเต เดฒเตเดตเดฒเตเดเตพ เดฎเดพเดคเตเดฐเดฎเต เดเดณเตเดณเตเดตเตเดเตเดเดฟเตฝ เดเดฒเตเดฒเดพเด เดถเดฐเดฟเดฏเดพเดเตเด, เดเดฃเตเดฃเด เดเดฐเต เดกเดธเดจเดฟเดจเตเดณเตเดณเดฟเตฝ เดเดฃเตเดเตเดเดฟเตฝ, เดเดจเตเดจเดพเตฝ 5 เดฒเตเดตเดฒเดฟเตฝ เดเตเดเตเดคเตฝ เดเดฃเตเดเตเดเตเดเดฟเตฝ, เดเดคเดฟเดจเดเด เดกเดธเตป เดเดฃเดเตเดเดฟเดจเต เดชเดฟเตปเดเดพเดฎเดฟเดเตพ เดเดฃเตเดเตเดเตเดเดฟเตฝ, เดชเตเดฐเดถเตเดจเดเตเดเตพ เดเดฃเตเดเดพเดเดพเด. เดชเดฐเดฎเตเดชเดฐเดพเดเดค เดกเตเตบ-เดฆเดฟ-เดเตเดฐเต เดธเตเตผเดเตเดเต เดเดชเตโเดทเดจเตเดเตพ เดเดเตเดเดจเตเดฏเดพเดฃเต เดเดดเตเดคเดชเตเดชเตเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเต (เดเดชเตเดชเด เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเต) เดเดจเตเดจเต เดจเตเดเตเดเดพเด. เดเดจเตเดจเดพเตฝ เดเดฆเตเดฏเด, เดเดเตเดเดณเตเดเต เดเดตเตเดทเดฃเดคเตเดคเดฟเดจเต เดเดฑเตเดฑเดตเตเด เดฐเดธเดเดฐเดฎเดพเดฏ เดจเตเดกเตเดเตพ เดเดคเตเดจเตเดจเต เดจเดฎเตเดเตเดเต เดจเดฟเตผเดฃเตเดฃเดฏเดฟเดเตเดเดพเด.
เดเดฑเตเดฑเดตเตเด เดเตเดเตเดคเตฝ "เดเดดเดฎเตเดณเตเดณ" เดเดชเดตเตเดเตเดทเดเตเดเตพ:
WITH RECURSIVE T AS (
SELECT
id
, pid
, ARRAY[id] path
FROM
hier
WHERE
pid IS NULL
UNION ALL
SELECT
hier.id
, hier.pid
, T.path || hier.id
FROM
T
JOIN
hier
ON hier.pid = T.id
)
TABLE T ORDER BY array_length(path, 1) DESC;
id | pid | path
---------------------------------------------
7624 | 7623 | {7615,7620,7621,7622,7623,7624}
4995 | 4994 | {4983,4985,4988,4993,4994,4995}
4991 | 4990 | {4983,4985,4988,4989,4990,4991}
...
เดเดฑเตเดฑเดตเตเด เดเตเดเตเดคเตฝ "เดตเดฟเดถเดพเดฒเด" เดเดชเดตเตเดเตเดทเดเตเดเตพ:
...
SELECT
path[1] id
, count(*)
FROM
T
GROUP BY
1
ORDER BY
2 DESC;
id | count
------------
5300 | 30
450 | 28
1239 | 27
1573 | 25
เด เดเตเดฆเตเดฏเดเตเดเตพเดเตเดเต เดเดเตเดเตพ เดธเดพเดงเดพเดฐเดฃ เดเดชเดฏเตเดเดฟเดเตเดเต เดเดตเตผเดคเตเดคเดจ เดเตเดฐเตฝ:
เดตเตเดฏเดเตเดคเดฎเดพเดฏเตเด, เด เด
เดญเตเดฏเตผเดคเตเดฅเดจ เดฎเดพเดคเตเดเดฏเดฟเตฝ เดเดตเตผเดคเตเดคเดจเดเตเดเดณเตเดเต เดเดฃเตเดฃเด เดฎเตเดคเตเดคเด เดชเดฟเตปเดเดพเดฎเดฟเดเดณเตเดเต เดเดฃเตเดฃเดคเตเดคเดฟเดจเต เดคเตเดฒเตเดฏเดฎเดพเดฏเดฟเดฐเดฟเดเตเดเตเด (เด
เดตเดฏเดฟเตฝ เดจเดฟเดฐเดตเดงเดฟ เดกเดธเตป เดเดฃเตเดเต), เดเดคเดฟเดจเต เดตเดณเดฐเต เดชเตเดฐเดงเดพเดจเดชเตเดชเตเดเตเด เดตเดฟเดญเดตเดเตเดเตพ เดเดเตเดเตเดเดพเด, เด
เดคเดฟเดจเตเดฑเต เดซเดฒเดฎเดพเดฏเดฟ เดธเดฎเดฏเด.
เดจเดฎเตเดเตเดเต "เดตเดฟเดถเดพเดฒเดฎเดพเดฏ" เดเดชเดตเตเดเตเดทเด เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเดพเด:
WITH RECURSIVE T AS (
SELECT
id
FROM
hier
WHERE
id = 5300
UNION ALL
SELECT
hier.id
FROM
T
JOIN
hier
ON hier.pid = T.id
)
TABLE T;
เดชเตเดฐเดคเตเดเตเดทเดฟเดเตเดเดคเตเดชเตเดฒเต, เดเดเตเดเตพ 30 เดฑเตเดเตเดเตเตผเดกเตเดเดณเตเด เดเดฃเตเดเตเดคเตเดคเดฟ. เดเดจเตเดจเดพเตฝ เด เดตเตผ เดฎเตเดคเตเดคเด เดธเดฎเดฏเดคเตเดคเดฟเดจเตเดฑเต 60% เดเดคเดฟเดจเดพเดฏเดฟ เดเตเดฒเดตเดดเดฟเดเตเดเต - เดเดพเดฐเดฃเด เด เดตเตผ เดธเตเดเดฟเดเดฏเดฟเตฝ 30 เดคเดฟเดฐเดฏเดฒเตเดเดณเตเด เดจเดเดคเตเดคเดฟ. เดเตเดฑเดเตเดเตเดเตเดเดฟ เดเตเดฏเตเดฏเดพเตป เดชเดฑเตเดฑเตเดฎเต?
เดธเตเดเดฟเด เดชเตเดฐเดเดพเดฐเด เดฌเตพเดเตเดเต เดชเตเดฐเตเดซเต เดฑเตเดกเดฟเดเดเต
เดเดฐเต เดจเตเดกเดฟเดจเตเด เดเดฐเต เดชเตเดฐเดคเตเดฏเตเด เดธเตเดเดฟเด เด
เดจเตเดตเตเดทเดฃเด เดจเดเดคเตเดคเตเดฃเตเดเดคเตเดฃเตเดเต? เดเดฒเตเดฒ เดเดจเตเดจเต เดฎเดพเดฑเตเดจเตเดจเต - เดจเดฎเตเดเตเดเต เดธเตเดเดฟเดเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเดพเดฏเดฟเดเตเดเดพเด เดเดฐเต เดเตเดณเดฟเตฝ เดเดฐเตเดธเดฎเดฏเด เดจเดฟเดฐเดตเดงเดฟ เดเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต เดธเดนเดพเดฏเดคเตเดคเตเดเต = ANY(array)
.
เด เดคเตเดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เดเดฐเต เดเดกเดจเตเดฑเดฟเดซเดฏเดฑเตเดเดณเดฟเดฒเตเด เดจเดฎเตเดเตเดเต เดฎเตเดฎเตเดชเดคเตเดคเต เดเดเตเดเดคเตเดคเดฟเตฝ เดเดฃเตเดเตเดคเตเดคเดฟเดฏ เดเดฒเตเดฒเดพ เดเดกเดฟเดเดณเตเด "เดจเตเดกเตเดเตพ" เดเดชเดฏเตเดเดฟเดเตเดเต เดเดเตเดเตเดเดพเด. เด เดคเดพเดฏเดคเต, เดเดฐเต เด เดเตเดคเตเดค เดเดเตเดเดคเตเดคเดฟเดฒเตเด เดเดเตเดเตพ เดเตเดฏเตเดฏเตเด เดเดฐเต เดจเดฟเดถเตเดเดฟเดค เดคเดฒเดคเตเดคเดฟเดฒเตเดณเตเดณ เดเดฒเตเดฒเดพ เดชเดฟเตปเดเดพเดฎเดฟเดเดณเตเดฏเตเด เดเดฐเตเดธเดฎเดฏเด เดคเดฟเดฐเดฏเตเด.
เดเดตเดฟเดเต เดฎเดพเดคเตเดฐเดฎเดพเดฃเต เดชเตเดฐเดถเตเดจเด, เดเดตเตผเดคเตเดคเดจ เดคเดฟเดฐเดเตเดเตเดเตเดชเตเดชเดฟเตฝ, เดเดฐเต เดจเตเดธเตเดฑเตเดฑเดกเต เด
เดจเตเดตเตเดทเดฃเดคเตเดคเดฟเตฝ เดจเดฟเดเตเดเตพเดเตเดเต เดธเตเดตเดฏเด เดเดเตเดธเดธเต เดเตเดฏเตเดฏเดพเตป เดเดดเดฟเดฏเดฟเดฒเตเดฒ, เดเดจเตเดจเดพเตฝ เดฎเตเดฎเตเดชเดคเตเดคเต เดฒเตเดตเดฒเดฟเตฝ เดเดฃเตเดเตเดคเตเดคเดฟเดฏเดต เดฎเดพเดคเตเดฐเด เดเดเตเดเตพ เดเดเตเดเดจเตเดฏเตเดเตเดเดฟเดฒเตเด เดคเดฟเดฐเดเตเดเตเดเตเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต... เดฎเตเดดเตเดตเตป เดคเดฟเดฐเดเตเดเตเดเตเดชเตเดชเดฟเดจเตเด เดเดฐเต เดจเตเดธเตเดฑเตเดฑเดกเต เด
เดจเตเดตเตเดทเดฃเด เดจเดเดคเตเดคเตเดจเตเดจเดคเต เด
เดธเดพเดงเตเดฏเดฎเดพเดฃเตเดจเตเดจเต เดเดคเต เดฎเดพเดฑเตเดจเตเดจเต, เดชเดเตเดทเต เด
เดคเดฟเดจเตเดฑเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเด เดซเตเตฝเดกเดฟเดจเต เดเดคเต เดธเดพเดงเตเดฏเดฎเดพเดฃเต. เด เดซเตเตฝเดกเตเด เดเดฐเต เด
เดฑเต เดเดเดพเด - เด
เดคเดพเดฃเต เดจเดฎเตเดฎเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดฃเตเดเดคเต ANY
.
เดเดคเต เด เตฝเดชเตเดชเด เดญเตเดฐเดพเดจเตเดคเดพเดฃเตเดจเตเดจเต เดคเตเดจเตเดจเตเดจเตเดจเต, เดชเดเตเดทเต เดกเดฏเดเตเดฐเดพเดฎเดฟเตฝ เดเดฒเตเดฒเดพเด เดฒเดณเดฟเดคเดฎเดพเดฃเต.
WITH RECURSIVE T AS (
SELECT
ARRAY[id] id$
FROM
hier
WHERE
id = 5300
UNION ALL
SELECT
ARRAY(
SELECT
id
FROM
hier
WHERE
pid = ANY(T.id$)
) id$
FROM
T
WHERE
coalesce(id$, '{}') <> '{}' -- ััะปะพะฒะธะต ะฒัั
ะพะดะฐ ะธะท ัะธะบะปะฐ - ะฟัััะพะน ะผะฐััะธะฒ
)
SELECT
unnest(id$) id
FROM
T;
เดเดตเดฟเดเต เดเดฑเตเดฑเดตเตเด เดชเตเดฐเดงเดพเดจเดชเตเดชเตเดเตเด เดเดพเดฐเตเดฏเด เดชเตเดฒเตเด เด เดฒเตเดฒ เดเตเดคเตเดฏเดธเดฎเดฏเดคเตเดคเต 1.5 เดคเดตเดฃ เดตเดฟเดเดฏเดฟเดเตเดเตเดเดธเตเดเดฟเดเดฏเดฟเดฒเตเดเตเดเต 5 เดเตเดณเตเดเตพเดเตเดเต เดชเดเดฐเด 30 เดเตเดณเตเดเตพ เดฎเดพเดคเตเดฐเดฎเต เดเดณเตเดณเต เดเดจเตเดจเดคเดฟเดจเดพเตฝ, เดเดเตเดเตพ เดเตเดฑเดเตเดเต เดฌเดซเดฑเตเดเตพ เดเตเดฑเดเตเดเดฟเดเตเดเตเดฃเตเดเต!
เด เดจเตเดคเดฟเดฎ เด เตบเดจเตเดธเตเดฑเตเดฑเดฟเดจเต เดถเตเดทเดตเตเด, เดเดกเดจเตเดฑเดฟเดซเดฏเดฑเตเดเตพ "เดฒเตเดตเดฒเตเดเตพ" เด เดจเตเดธเดฐเดฟเดเตเดเต เดเตเดฐเดฎเตเดเดฐเดฟเดเตเดเต เดคเตเดเดฐเตเด เดเดจเตเดจเดคเดพเดฃเต เดเดฐเต เด เดงเดฟเด เดฌเตเดฃเดธเต.
เดจเตเดกเต เดเดฟเดนเตเดจเด
เดชเตเดฐเดเดเดจเด เดฎเตเดเตเดเดชเตเดชเตเดเตเดคเตเดคเดพเตป เดธเดนเดพเดฏเดฟเดเตเดเตเดจเตเดจ เด เดเตเดคเตเดค เดชเดฐเดฟเดเดฃเดจ -- "เดเดฒเดเตพเดเตเดเต" เดเตเดเตเดเดฟเดเดณเตเดฃเตเดเดพเดเดฟเดฒเตเดฒ, เด เดคเดพเดฏเดคเต, เด เดตเตผเดเตเดเต "เดคเดพเดดเตเดเตเดเต" เดจเตเดเตเดเตเดฃเตเด เดเดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ. เดเดเตเดเดณเตเดเต เดเตเดฎเดคเดฒเดฏเตเดเต เดฐเตเดชเตเดเดฐเดฃเดคเตเดคเดฟเตฝ, เดเดคเดฟเดจเตผเดคเตเดฅเด เดเดเตเดเตพ เดตเดเตเดชเตเดชเตเดเดณเตเดเต เดถเตเดเดเดฒ เดชเดฟเดจเตเดคเตเดเดฐเตเดเดฏเตเด เดเดฐเต เดเตเดตเดจเดเตเดเดพเดฐเดจเดฟเตฝ เดเดคเตเดคเตเดเดฏเตเด เดเตเดฏเตเดคเดพเตฝ, เด เดถเดพเดเดฏเดฟเตฝ เดเตเดเตเดคเตฝ เดจเตเดเตเดเตเดฃเตเด เดเดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ เดเดจเตเดจเดพเดฃเต.
เดจเดฎเตเดเตเดเต เดจเดฎเตเดฎเตเดเต เดฎเตเดถเดฏเดฟเดฒเตเดเตเดเต เดเดเดเตเดเดพเด เด
เดงเดฟเด boolean
-เดซเตเตฝเดกเต, เดจเดฎเตเดฎเตเดเต เดเตเดฐเตเดฏเดฟเดฒเต เด เดชเตเดฐเดคเตเดฏเตเด เดเตปเดเตเดฐเดฟ เดเดฐเต "เดจเตเดกเต" เดเดฃเต - เด
เดคเดพเดฏเดคเต, เด
เดคเดฟเดจเต เดธเดจเตเดคเดคเดฟเดเตพ เดเดฃเตเดเดพเดเตเดฎเต เดเดจเตเดจเต เด
เดคเต เดเดเตป เดคเดจเตเดจเต เดเดเตเดเดณเตเดเต เดชเดฑเดฏเตเด.
ALTER TABLE hier
ADD COLUMN branch boolean;
UPDATE
hier T
SET
branch = TRUE
WHERE
EXISTS(
SELECT
NULL
FROM
hier
WHERE
pid = T.id
LIMIT 1
);
-- ะะฐะฟัะพั ััะฟะตัะฝะพ ะฒัะฟะพะปะฝะตะฝ: 3033 ัััะพะบ ะธะทะผะตะฝะตะฝะพ ะทะฐ 42 ะผั.
เดเตเดณเตเดณเดพเด! เดเดฒเตเดฒเดพ เดตเตเดเตเดท เดฎเตเดฒเดเดเตเดเดณเดฟเดฒเตเด 30% เตฝ เดเตเดเตเดคเตฝ เดฎเดพเดคเตเดฐเดฎเต เดชเดฟเตปเดเดพเดฎเดฟเดเดณเตเดณเตเดณเตเดตเตเดจเตเดจเต เดเดคเต เดฎเดพเดฑเตเดจเตเดจเต.
เดเดชเตเดชเตเตพ เดจเดฎเตเดเตเดเต เด
เดฒเตเดชเด เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏ เดฎเตเดเตเดเดพเดจเดฟเดเตเดเต เดเดชเดฏเตเดเดฟเดเตเดเดพเด - เดเดตเตผเดคเตเดคเดจ เดญเดพเดเดคเตเดคเตเดเตเดเตเดณเตเดณ เดเดฃเดเตเดทเดจเตเดเตพ LATERAL
, เดเดตเตผเดคเตเดคเดจ "เดชเดเตเดเดฟเด" เดฏเตเดเต เดซเตเตฝเดกเตเดเตพ เดเดเดจเดเดฟ เดเดเตเดธเดธเต เดเตเดฏเตเดฏเดพเตป เดเดเตเดเดณเต เด
เดจเตเดตเดฆเดฟเดเตเดเตเดเดฏเตเด เดเตเดเดณเตเดเต เดธเตเดฑเตเดฑเต เดเตเดฑเดฏเตเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดเดฐเต เดจเตเดกเต เด
เดเดฟเดธเตเดฅเดพเดจเดฎเดพเดเตเดเดฟเดฏเตเดณเตเดณ เดซเดฟเตฝเดเตเดเดฑเดฟเดเดเต เด
เดตเดธเตเดฅเดฏเตเดณเตเดณ เดเดฐเต เดฎเตเดคเตเดคเดคเตเดคเดฟเดฒเตเดณเตเดณ เดซเดเดเตเดทเตป เดเดชเดฏเตเดเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเด:
WITH RECURSIVE T AS (
SELECT
array_agg(id) id$
, array_agg(id) FILTER(WHERE branch) ns$
FROM
hier
WHERE
id = 5300
UNION ALL
SELECT
X.*
FROM
T
JOIN LATERAL (
SELECT
array_agg(id) id$
, array_agg(id) FILTER(WHERE branch) ns$
FROM
hier
WHERE
pid = ANY(T.ns$)
) X
ON coalesce(T.ns$, '{}') <> '{}'
)
SELECT
unnest(id$) id
FROM
T;
เดเดฐเต เดธเตเดเดฟเด เดเตเตพ เดเตเดเดฟ เดเตเดฑเดฏเตเดเตเดเดพเตป เดเดเตเดเตพเดเตเดเต เดเดดเดฟเดเตเดเต เดตเตเดณเดฟเดฏเดคเตเดคเดฟเตฝ 2 เดคเดตเดฃเดฏเดฟเตฝ เดเตเดเตเดคเตฝ เดตเดฟเดเดฏเดฟเดเตเดเต เดชเตเดฐเตเดซเต เดฑเตเดกเต.
#2. เดจเดฎเตเดเตเดเต เดตเตเดฐเตเดเดณเดฟเดฒเตเดเตเดเต เดฎเดเดเตเดเดพเด
เดเดคเต เดธเตเดดเตโเดธเต เดทเตเดฑเตเดฑเดฟเดจเต (เดเดคเตเดเตเดเต เดธเตเดเดเดเตเดเดณเตเดเต) เดธเดพเดฎเตเดชเดฟเดณเดฟเตฝ เดเตพเดชเตเดชเตเดเตเดคเตเดคเดฟ เดเดจเตเดจเดคเดฟเดจเต เดเตเดฑเดฟเดเตเดเตเดณเตเดณ เดตเดฟเดตเดฐเดเตเดเตพ เดจเดฟเดฒเดจเดฟเตผเดคเตเดคเดฟเดเตเดเตเดฃเตเดเต, "เดฎเดฐเดคเตเดคเดฟเดจเตเดฑเต เดฎเตเดเดณเดฟเดฒเตเดณเตเดณ" เดเดฒเตเดฒเดพ เดเดเดเดเตเดเดณเตเดเตเดฏเตเด เดฑเตเดเตเดเตเตผเดกเตเดเตพ เดจเดฟเดเตเดเตพเดเตเดเต เดถเตเดเดฐเดฟเดเตเดเดฃเดฎเตเดเตเดเดฟเตฝ เด เด เตฝเดเตเดฐเดฟเดคเด เดเดชเดฏเตเดเดชเตเดฐเดฆเดฎเดพเดเตเด - เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดเดฐเต เดธเดเดเตเดฐเดน เดฑเดฟเดชเตเดชเตเตผเดเตเดเต เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดจเตเดกเตเดเดณเดฟเดฒเตเดเตเดเตเดณเตเดณ เดเตเดเตเดเดฟเดเตเดเตเตผเดเตเดเดฒเดฟเดจเตเดชเตเดชเด.
เด
เดญเตเดฏเตผเดคเตเดฅเดจ เดตเดณเดฐเต เดฌเตเดฆเตเดงเดฟเดฎเตเดเตเดเตเดณเตเดณเดคเดพเดฏเดฟ เดฎเดพเดฑเตเดจเตเดจเดคเดฟเดจเดพเตฝ, เดเดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจเดต เดเดถเดฏเดคเตเดคเดฟเดจเตเดฑเต เดคเตเดณเดฟเดตเดพเดฏเดฟ เดฎเดพเดคเตเดฐเด เดเดเตเดเตเดเดฃเด. เดเดจเตเดจเดพเตฝ เดเดคเต เดจเดฟเดเตเดเดณเตเดเต เดกเดพเดฑเตเดฑเดพเดฌเตเดธเดฟเตฝ เดเดงเดฟเดชเดคเตเดฏเด เดธเตเดฅเดพเดชเดฟเดเตเดเตเดเดฏเดพเดฃเตเดเตเดเดฟเตฝ, เดธเดฎเดพเดจเดฎเดพเดฏ เดธเดพเดเตเดเตเดคเดฟเด เดตเดฟเดฆเตเดฏเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดเตเดเตเดฑเดฟเดเตเดเต เดจเดฟเดเตเดเตพ เดเดฟเดจเตเดคเดฟเดเตเดเดฃเด.
เดเตเดฑเดเตเดเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดชเตเดฐเดธเตเดคเดพเดตเดจเดเดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฎเตเดเตเดเต เดเดฐเดเดญเดฟเดเตเดเดพเด:
- เดกเดพเดฑเตเดฑเดพเดฌเตเดธเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เด เดคเต เดฑเตเดเตเดเตเตผเดกเต เดเดฐเดฟเดเตเดเตฝ เดฎเดพเดคเตเดฐเด เดตเดพเดฏเดฟเดเตเดเตเดจเตเดจเดคเดพเดฃเต เดจเดฒเตเดฒเดคเต.
- เดกเดพเดฑเตเดฑเดพเดฌเตเดธเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดฐเตเดเดเตพ เดฌเดพเดเตเดเตเดเดณเดฟเตฝ เดตเดพเดฏเดฟเดเตเดเตเดจเตเดจเดคเต เดเตเดเตเดคเตฝ เดเดพเดฐเตเดฏเดเตเดทเดฎเดฎเดพเดฃเตเดเดฑเตเดฑเดฏเตเดเตเดเตเดเตเดเดพเตพ.
เดเดชเตเดชเตเตพ เดจเดฎเตเดเตเดเต เดเดตเดถเตเดฏเดฎเตเดณเตเดณ เด เดญเตเดฏเตผเดคเตเดฅเดจ เดจเดฟเตผเดฎเตเดฎเดฟเดเตเดเดพเตป เดถเตเดฐเดฎเดฟเดเตเดเดพเด.
เดเดเตเดเด เดเตเดธเดจเตเดฎเตเดเตเดธ
เดตเตเดฏเดเตเดคเดฎเดพเดฏเตเด, เดเดตเตผเดคเตเดคเดจเด เดเดฐเดเดญเดฟเดเตเดเตเดฎเตเดชเตเตพ (เด เดคเดฟเดฒเตเดฒเดพเดคเต เดจเดฎเตเดฎเตพ เดเดตเดฟเดเตเดฏเดพเดฏเดฟเดฐเดฟเดเตเดเตเด!) เดชเตเดฐเดพเดฐเดเดญ เดเดกเดจเตเดฑเดฟเดซเดฏเดฑเตเดเดณเตเดเต เดเดฃเดคเตเดคเต เด เดเดฟเดธเตเดฅเดพเดจเดฎเดพเดเตเดเดฟ เดเดฒเดเดณเตเดเต เดฐเตเดเดเตพ เดคเดจเตเดจเต เดเตเดฑเดฏเตเดเตเดเตเดฃเตเดเดฟ เดตเดฐเตเด:
WITH RECURSIVE tree AS (
SELECT
rec -- ััะพ ัะตะปัะฝะฐั ะทะฐะฟะธัั ัะฐะฑะปะธัั
, id::text chld -- ััะพ "ะฝะฐะฑะพั" ะฟัะธะฒะตะดัะธั
ััะดะฐ ะธัั
ะพะดะฝัั
ะปะธัััะตะฒ
FROM
hier rec
WHERE
id = ANY('{1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192}'::integer[])
UNION ALL
...
"เดธเตเดฑเตเดฑเต" เดเดฐเต เดธเตเดเตเดฐเดฟเดเดเดพเดฏเดฟเดเตเดเดฒเตเดฒ เดธเดเดญเดฐเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเต เดเดจเตเดจเดคเต เดเตผเดเตเดเตเดเตเดเดฟเดฒเตเด เดตเดฟเดเดฟเดคเตเดฐเดฎเดพเดฏเดฟ เดคเตเดจเตเดจเดฟเดฏเดพเตฝ, เดเดคเดฟเดจเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดเดฐเต เดตเดฟเดถเดฆเตเดเดฐเดฃเดฎเตเดฃเตเดเต. เดธเตเดเตเดฐเดฟเดเดเตเดเตพเดเตเดเดพเดฏเดฟ เดเดฐเต เดฌเดฟเตฝเดฑเตเดฑเต-เดเตป เด
เดเตเดฐเดเตเดฑเตเดฑเดฟเดเดเต "เดเตเดฒเตเดฏเดฟเดเดเต" เดซเดเดเตเดทเตป เดเดฃเตเดเต string_agg
, เดเดจเตเดจเดพเตฝ เด
เดฑเตเดเตพเดเตเดเดฒเตเดฒ. เด
เดตเตพ เดเดฃเตเดเตเดเดฟเดฒเตเด
เดเดเตเดเด เดเตเดธเดจเตเดฎเตเดเตเดธ
เดเดชเตเดชเตเตพ เดจเดฎเตเดเตเดเต เดเดฐเต เดเตเดเตเดเด เดธเตเดเตเดทเตป เดเดกเดฟเดเตพ เดฒเดญเดฟเดเตเดเตเด, เด เดคเต เดเตเดเตเดคเตฝ เดตเดพเดฏเดฟเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต. เดฎเดฟเดเตเดเดตเดพเดฑเตเด เดเดฒเตเดฒเดพเดฏเตโเดชเตเดชเตเดดเตเด เด เดต เดฏเดฅเดพเตผเดคเตเดฅ เดธเตเดฑเตเดฑเดฟเดจเตเดฑเต เดตเตเดฏเดคเตเดฏเดธเตโเดค เดฑเตเดเตเดเตเตผเดกเตเดเดณเดฟเตฝ เดคเดจเดฟเดชเตเดชเดเตผเดชเตเดชเดพเดเตเดเตเด - เด เดคเดฟเดจเดพเตฝ เดเดเตเดเตพ เดเตเดฏเตเดฏเตเด เด เดตเดฐเต เดเตเดฐเตเดชเตเดชเตเดเตเดฏเตเดฏเตเด, เดเดฑเดตเดฟเด เดเดฒเดเดณเตเดเตเดเตเดฑเดฟเดเตเดเตเดณเตเดณ เดตเดฟเดตเดฐเดเตเดเตพ เดธเดเดฐเดเตเดทเดฟเดเตเดเตเดฎเตเดชเตเตพ.
เดเดจเตเดจเดพเตฝ เดเดตเดฟเดเต เดฎเตเดจเตเดจเต เดเตเดดเดชเตเดชเดเตเดเตพ เดจเดฎเตเดฎเต เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต:
- เด
เดจเตเดตเตเดทเดฃเดคเตเดคเดฟเดจเตเดฑเต "เดธเดฌเตเดฐเตเดเตเดเตผเดธเตเดตเต" เดญเดพเดเดคเตเดคเต เดฎเตเดคเตเดคเดคเตเดคเดฟเดฒเตเดณเตเดณ เดซเดเดเตโเดทเดจเตเดเตพ เดเตพเดเตเดเตเดณเตเดณเดพเตป เดเดดเดฟเดฏเดฟเดฒเตเดฒ
GROUP BY
. - เดเดฐเต เดเดตเตผเดคเตเดคเดจ "เดชเดเตเดเดฟเด" เดฏเตเดเตเดเตเดฑเดฟเดเตเดเตเดณเตเดณ เดเดฐเต เดฑเดซเดฑเตปเดธเต เดเดฐเต เดจเตเดธเตเดฑเตเดฑเดกเต เดธเดฌเตเดเตเดตเดฑเดฟเดฏเดฟเตฝ เดเดฃเตเดเดพเดเดฐเตเดคเต.
- เดเดตเตผเดคเตเดคเดจ เดญเดพเดเดคเตเดคเดฟเดฒเต เดเดฐเต เด เดญเตเดฏเตผเดคเตเดฅเดจเดฏเดฟเตฝ เดเดฐเต CTE เด เดเดเตเดเดฟเดฏเดฟเดฐเดฟเดเตเดเดฐเตเดคเต.
เดญเดพเดเตเดฏเดตเดถเดพเตฝ, เด เดชเตเดฐเดถเตเดจเดเตเดเดณเตเดฒเตเดฒเดพเด เดชเดฐเดฟเดนเดฐเดฟเดเตเดเดพเตป เดตเดณเดฐเต เดเดณเตเดชเตเดชเดฎเดพเดฃเต. เด เดตเดธเดพเดจเด เดฎเตเดคเตฝ เดคเตเดเดเตเดเดพเด.
เดเดตเตผเดคเตเดคเดจ เดญเดพเดเดคเตเดคเต เดธเดฟ.เดเดฟ.เด
เดเดคเตเดชเตเดพเดฒเต เด เดฒเตเดฒ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเต:
WITH RECURSIVE tree AS (
...
UNION ALL
WITH T (...)
SELECT ...
)
เด เดคเดฟเดจเดพเตฝ เดเดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเต, เดชเดฐเดพเตปเดคเตเดธเดฟเดธเตเดเตพ เดตเตเดฏเดคเตเดฏเดพเดธเด เดตเดฐเตเดคเตเดคเตเดจเตเดจเต!
WITH RECURSIVE tree AS (
...
UNION ALL
(
WITH T (...)
SELECT ...
)
)
เดเดฐเต เดเดตเตผเดคเตเดคเดจ "เดเตเดฌเดฟเดณเดฟเดจเต" เดเดคเดฟเดฐเตเดฏเตเดณเตเดณ เดจเตเดธเตเดฑเตเดฑเดกเต เด เดจเตเดตเตเดทเดฃเด
เดนเตเด... เดเดฐเต เดธเดฌเตเดเตเดตเดฑเดฟเดฏเดฟเตฝ เดเดฐเต เดเดตเตผเดคเตเดคเดจ CTE เดเดเตเดธเดธเต เดเตเดฏเตเดฏเดพเตป เดเดดเดฟเดฏเดฟเดฒเตเดฒ. เดชเดเตเดทเต เด เดคเต CTE เดเดณเตเดณเดฟเดฒเดพเดฏเดฟเดฐเดฟเดเตเดเดพเด! เดเดฐเต เดจเตเดธเตเดฑเตเดฑเดกเต เด เดญเตเดฏเตผเดคเตเดฅเดจเดฏเตเดเตเดเต เดเดคเดฟเดจเดเด เดคเดจเตเดจเต เด CTE เดเดเตโเดธเดธเต เดเตเดฏเตเดฏเดพเตป เดเดดเดฟเดฏเตเด!
เดเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเตเดณเตเดณเดฟเดฒเต เดเตเดฐเตเดชเตเดชเต
เดเดคเต เด
เดฐเตเดเดเดฎเดพเดฃเต, เดชเดเตเดทเต... GROUP เดเดชเดฏเตเดเดฟเดเตเดเต เด
เดจเตเดเดฐเดฟเดเตเดเดพเตป เดเดเตเดเตพเดเตเดเต เดเดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดฎเดพเตผเดเดฎเตเดฃเตเดเต DISTINCT ON
เดตเดฟเตปเดกเต เดซเดเดเตโเดทเดจเตเดเดณเตเด!
SELECT
(rec).pid id
, string_agg(chld::text, ',') chld
FROM
tree
WHERE
(rec).pid IS NOT NULL
GROUP BY 1 -- ะฝะต ัะฐะฑะพัะฐะตั!
เดเดคเต เดเดเตเดเดจเตเดฏเดพเดฃเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดคเต!
SELECT DISTINCT ON((rec).pid)
(rec).pid id
, string_agg(chld::text, ',') OVER(PARTITION BY (rec).pid) chld
FROM
tree
WHERE
(rec).pid IS NOT NULL
เดธเดเดเตเดฏเดพ เดเดกเดฟ เดเดจเตเดคเดฟเดจเดพเดฃเต เดเตเดเตโเดธเตโเดฑเตเดฑเดพเดเตเดเดฟ เดฎเดพเดฑเตเดฑเดฟเดฏเดคเตเดจเตเดจเต เดเดชเตเดชเตเตพ เดจเดฎเตเดฎเตพ เดเดพเดฃเตเดจเตเดจเต - เด เดเตเดเดจเต เด เดตเดฏเต เดเตเดฎเดเดณเดพเตฝ เดตเตเตผเดคเดฟเดฐเดฟเดเตเดเดพเดจเดพเดเตเด!
เดเดเตเดเด เดเตเดธเดจเตเดฎเตเดเตเดธ
เดซเตเดจเดฒเดฟเดจเดพเดฏเดฟ เดเดเตเดเตพเดเตเดเต เดเดจเตเดจเตเด เด เดตเดถเตเดทเดฟเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒ:
- เดเตเดฐเตเดชเตเดชเตเดเตเดฏเตเดค เดเดกเดฟเดเดณเตเดเต เดเดฐเต เดเตเดเตเดเดคเตเดคเต เด เดเดฟเดธเตเดฅเดพเดจเดฎเดพเดเตเดเดฟเดฏเดพเดฃเต เดเดเตเดเตพ "เดตเดฟเดญเดพเดเด" เดฑเตเดเตเดเตเตผเดกเตเดเตพ เดตเดพเดฏเดฟเดเตเดเตเดจเตเดจเดคเต
- เดเดเตเดเตพ เดเตเดฑเดฏเตเดเตเดเตเดจเตเดจ เดตเดฟเดญเดพเดเดเตเดเดณเต เดฏเดฅเดพเตผเดคเตเดฅ เดทเตเดฑเตเดฑเตเดเดณเตเดเต "เดธเตเดฑเตเดฑเตเดเดณเตเดฎเดพเดฏเดฟ" เดคเดพเดฐเดคเดฎเตเดฏเด เดเตเดฏเตเดฏเตเดจเตเดจเต
- เดเดชเดฏเตเดเดฟเดเตเดเต เดธเตเดฑเตเดฑเต-เดธเตเดเตเดฐเดฟเดเดเต "เดตเดฟเดเดธเดฟเดชเตเดชเดฟเดเตเดเตเด"
unnest(string_to_array(chld, ',')::integer[])
WITH RECURSIVE tree AS (
SELECT
rec
, id::text chld
FROM
hier rec
WHERE
id = ANY('{1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192}'::integer[])
UNION ALL
(
WITH prnt AS (
SELECT DISTINCT ON((rec).pid)
(rec).pid id
, string_agg(chld::text, ',') OVER(PARTITION BY (rec).pid) chld
FROM
tree
WHERE
(rec).pid IS NOT NULL
)
, nodes AS (
SELECT
rec
FROM
hier rec
WHERE
id = ANY(ARRAY(
SELECT
id
FROM
prnt
))
)
SELECT
nodes.rec
, prnt.chld
FROM
prnt
JOIN
nodes
ON (nodes.rec).id = prnt.id
)
)
SELECT
unnest(string_to_array(chld, ',')::integer[]) leaf
, (rec).*
FROM
tree;
เด
เดตเดฒเดเดฌเด: www.habr.com