เจเฉเฉฐเจเจฒเจฆเจพเจฐ ERP เจชเฉเจฐเจฃเจพเจฒเฉเจเจ เจตเจฟเฉฑเจ เจฌเจนเฉเจค เจธเจพเจฐเฉเจเจ เจธเฉฐเจธเจฅเจพเจตเจพเจ เจฆเฉ เจฒเฉเฉเจตเจพเจฐ เจชเฉเจฐเจเจฟเจฐเจคเฉ เจนเฉเฉฐเจฆเฉ เจนเฉเจเจฆเฉเจ เจธเจฎเจฐเฉเจช เจตเจธเจคเฉเจเจ เจฒเจพเจเจจ เจตเจฟเฉฑเจ เจฒเฉฑเจเจฆเฉเจเจ เจนเจจ เจชเฉเจฐเจตเจ-เจตเฉฐเจธเจผ เจฆเฉ เจฐเจฟเจธเจผเจคเฉ เจฆเจพ เจฐเฉเฉฑเจ - เจเจน เจเจเจเจฐเจชเฉเจฐเจพเจเจเจผ เจฆเจพ เจธเฉฐเจเจ เจจเจพเจคเจฎเจ เจขเจพเจเจเจพ เจนเฉ (เจเจน เจธเจพเจฐเฉเจเจ เจธเจผเจพเจเจพเจตเจพเจ, เจตเจฟเจญเจพเจ เจ เจคเฉ เจเฉฐเจฎ เจธเจฎเฉเจน), เจ เจคเฉ เจฎเจพเจฒ เจฆเฉ เจธเฉเจเฉ, เจ เจคเฉ เจเฉฐเจฎ เจฆเฉ เจเฉเจคเจฐเจพเจ, เจ เจคเฉ เจตเจฟเจเจฐเฉ เจฌเจฟเฉฐเจฆเฉเจเจ เจฆเจพ เจญเฉเจเฉเจฒ, ...
เจตเจพเจธเจคเจต เจตเจฟเฉฑเจ, เจเฉเจ เจตเฉ เจจเจนเฉเจ เจนเฉ
DBMS เจตเจฟเฉฑเจ เจ เจเจฟเจนเฉ เจฐเฉเฉฑเจ เจจเฉเฉฐ เจธเจเฉเจฐ เจเจฐเจจ เจฆเฉ เจฌเจนเฉเจค เจธเจพเจฐเฉ เจคเจฐเฉเจเฉ เจนเจจ, เจชเจฐ เจ เฉฑเจ เจ เจธเฉเจ เจธเจฟเจฐเจซ เจเฉฑเจ เจตเจฟเจเจฒเจช 'เจคเฉ เจงเจฟเจเจจ เจเฉเจเจฆเจฐเจค เจเจฐเจพเจเจเฉ:
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)
.
เจ เจคเฉ เจชเจเจพเจฃเจเจฐเจคเจพเจตเจพเจ เจฆเฉ เจ เจเจฟเจนเฉ เจนเจฐเฉเจ เจธเจฎเฉเจน เจตเจฟเฉฑเจ เจ เจธเฉเจ "เจจเฉเจกเจธ" เจฆเฉเจเจฐเจพ เจชเจฟเจเจฒเฉ เจชเฉเจพเจ เจตเจฟเฉฑเจ เจฒเฉฑเจญเฉเจเจ เจธเจพเจฐเฉเจเจ IDs เจฒเฉ เจธเจเจฆเฉ เจนเจพเจเฅค เจญเจพเจต, เจนเจฐ เจ เจเจฒเฉ เจชเฉเจพเจ 'เจคเฉ เจ เจธเฉเจ เจเจฐเจพเจเจเฉ เจเฉฑเจ เจตเจพเจฐ เจตเจฟเฉฑเจ เจเฉฑเจ เจเจพเจธ เจชเฉฑเจงเจฐ เจฆเฉ เจธเจพเจฐเฉ เจตเฉฐเจธเจผเจเจพเจ เจฆเฉ เจเฉเจ เจเจฐเฉ.
เจธเจฟเจฐเจซ, เจเฉฑเจฅเฉ เจธเจฎเฉฑเจธเจฟเจ เจนเฉ, เจเจตเจฐเจคเฉ เจเฉเจฃ เจตเจฟเฉฑเจ, เจคเฉเจธเฉเจ เจเฉฑเจ เจจเฉเจธเจเจก เจชเฉเฉฑเจเจเจฟเฉฑเจ เจตเจฟเฉฑเจ เจเจชเจฃเฉ เจเจช เจจเฉเฉฐ เจเจเจธเฉเจธ เจจเจนเฉเจ เจเจฐ เจธเจเจฆเฉ เจนเฉ, เจชเจฐ เจธเจพเจจเฉเฉฐ เจเจฟเจธเฉ เจคเจฐเฉเจนเจพเจ เจธเจฟเจฐเจซเจผ เจเจนเฉ เจเฉเจฃเจจ เจฆเฉ เจฒเฉเฉ เจนเฉ เจเฉ เจชเจฟเจเจฒเฉ เจชเฉฑเจงเจฐ 'เจคเฉ เจชเจพเจเจ เจเจฟเจ เจธเฉ... เจเจน เจชเจคเจพ เจเจฒเจฆเจพ เจนเฉ เจเจฟ เจชเฉเจฐเฉ เจเฉเจฃ เจฒเจ เจจเฉเจธเจเจก เจชเฉเฉฑเจเจเจฟเฉฑเจ เจเจฐเจจเจพ เจ
เจธเฉฐเจญเจต เจนเฉ, เจชเจฐ เจเจธเจฆเฉ เจเจพเจธ เจเฉเจคเจฐ เจฒเจ เจเจน เจธเฉฐเจญเจต เจนเฉเฅค เจ
เจคเฉ เจเจน เจเฉเจคเจฐ เจเฉฑเจ เจเจฐเฉ เจตเฉ เจนเฉ เจธเจเจฆเจพ เจนเฉ - เจเฉ เจเจฟ เจธเจพเจจเฉเฉฐ เจตเจฐเจคเจฃ เจฆเฉ เจฒเฉเฉ เจนเฉ 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. เจเจ เจเฉเฉเจนเจพเจ เจตเฉฑเจฒ เจตเจพเจชเจธ เจเฉฑเจฒเฉเจ
เจเจน เจเจฒเจเฉเจฐเจฟเจฆเจฎ เจฒเจพเจญเจฆเจพเจเจ เจนเฉเจตเฉเจเจพ เจเฉเจเจฐ เจคเฉเจนเจพเจจเฉเฉฐ "เจฐเฉเฉฑเจ เจฆเฉ เจเฉฑเจชเจฐ" เจธเจพเจฐเฉ เจคเฉฑเจคเจพเจ เจฒเจ เจฐเจฟเจเจพเจฐเจก เจเจเฉฑเจ เฉ เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉ, เจเจธ เจฌเจพเจฐเฉ เจเจพเจฃเจเจพเจฐเฉ เจจเฉเฉฐ เจฌเจฐเจเจฐเจพเจฐ เจฐเฉฑเจเจฆเฉ เจนเฉเจ เจเจฟ เจเจฟเจนเฉเฉ เจธเจฐเฉเจค เจธเจผเฉเจ (เจ เจคเฉ เจเจฟเจนเฉเฉ เจธเฉฐเจเฉเจคเจพเจ เจจเจพเจฒ) เจเจธ เจจเฉเฉฐ เจจเจฎเฉเจจเฉ เจตเจฟเฉฑเจ เจธเจผเจพเจฎเจฒ เจเจฐเจจ เจฆเจพ เจเจพเจฐเจจ เจฌเจฃเฉ - เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจเฉฑเจ เจธเฉฐเจเฉเจช เจฐเจฟเจชเฉเจฐเจ เจฌเจฃเจพเจเจฃ เจฒเจ เจจเฉเจกเจพเจ เจตเจฟเฉฑเจ เจเจเฉเจเจฐเจฃ เจฆเฉ เจจเจพเจฒ.
เจนเฉเจ เจฒเจฟเจเฉเจเจ เจเฉฑเจฒเจพเจ เจจเฉเฉฐ เจธเจฟเจฐเจซเจผ เจธเฉฐเจเจฒเจช เจฆเฉ เจธเจฌเฉเจค เจตเจเฉเจ เจฒเจฟเจ เจเจพเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ, เจเจฟเจเจเจเจฟ เจฌเฉเจจเจคเฉ เจฌเจนเฉเจค เจฌเฉเจเจฒ เจธเจพเจฌเจค เจนเฉเฉฐเจฆเฉ เจนเฉเฅค เจชเจฐ เจเฉ เจเจน เจคเฉเจนเจพเจกเฉ เจกเฉเจเจพเจฌเฉเจธ 'เจคเฉ เจนเจพเจตเฉ เจนเฉ, เจคเจพเจ เจคเฉเจนเจพเจจเฉเฉฐ เจธเจฎเจพเจจ เจคเจเจจเฉเจเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฌเจพเจฐเฉ เจธเฉเจเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ.
เจเจ เจเฉเจ เจธเจงเจพเจฐเจจ เจเจฅเจจเจพเจ เจจเจพเจฒ เจธเจผเฉเจฐเฉ เจเจฐเฉเจ:
- เจกเฉเจเจพเจฌเฉเจธ เจคเฉเจ เจเจนเฉ เจฐเจฟเจเจพเจฐเจก เจเจธ เจจเฉเฉฐ เจธเจฟเจฐเจซเจผ เจเฉฑเจ เจตเจพเจฐ เจชเฉเฉเจนเจจเจพ เจธเจญ เจคเฉเจ เจตเจงเฉเจ เจนเฉ.
- เจกเจพเจเจพเจฌเฉเจธ เจคเฉเจ เจฐเจฟเจเจพเจฐเจก เจฌเฉเจเจพเจ เจตเจฟเฉฑเจ เจชเฉเฉเจนเจจเจพ เจตเจงเฉเจฐเฉ เจเฉเจธเจผเจฒ เจนเฉเจเจเฉฑเจฒเฉ เจจเจพเจฒเฉเจ.
เจนเฉเจฃ เจธเจพเจจเฉเฉฐ เจฒเฉเฉเฉเจเจฆเฉ เจฌเฉเจจเจคเฉ เจจเฉเฉฐ เจฌเจฃเจพเจเจฃ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเฉเจเฅค
เจเจฆเจฎ 1
เจธเจชเฉฑเจธเจผเจ เจคเฉเจฐ 'เจคเฉ, เจฐเฉเจเจฐเจธเจผเจจ เจจเฉเฉฐ เจธเจผเฉเจฐเฉ เจเจฐเจจ เจตเฉเจฒเฉ (เจ เจธเฉเจ เจเจธ เจคเฉเจ เจฌเจฟเจจเจพเจ เจเจฟเฉฑเจฅเฉ เจนเฉเจตเจพเจเจเฉ!) เจธเจพเจจเฉเฉฐ เจธเจผเฉเจฐเฉเจเจคเฉ เจชเจเจพเจฃเจเจฐเจคเจพเจตเจพเจ เจฆเฉ เจธเฉเฉฑเจ เจฆเฉ เจเจงเจพเจฐ 'เจคเฉ เจชเฉฑเจคเจฟเจเจ เจฆเฉ เจฐเจฟเจเจพเจฐเจกเจพเจ เจจเฉเฉฐ เจเจชเจฃเฉ เจเจช เจเจเจพเจเจฃเจพ เจนเฉเจตเฉเจเจพ:
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
, เจชเจฐ เจเจฐเฉ เจฒเจ เจจเจนเฉเจเฅค เจนเจพเจฒเจพเจเจเจฟ เจเจน
เจเจฆเจฎ 2
เจนเฉเจฃ เจธเจพเจจเฉเฉฐ เจธเฉเจเจธเจผเจจ เจเจเจกเฉ เจฆเจพ เจเฉฑเจ เจธเฉเฉฑเจ เจฎเจฟเจฒเฉเจเจพ เจเจฟเจธเจจเฉเฉฐ เจ เฉฑเจเฉ เจชเฉเฉเจนเจจ เจฆเฉ เจฒเฉเฉ เจนเฉเจตเฉเจเฉเฅค เจฒเจเจญเจ เจนเจฎเฉเจธเจผเจพ เจเจน เจ เจธเจฒเฉ เจธเฉเฉฑเจ เจฆเฉ เจตเฉฑเจ-เจตเฉฑเจ เจฐเจฟเจเจพเจฐเจกเจพเจ เจตเจฟเฉฑเจ เจกเฉเจชเจฒเฉเจเฉเจ เจเฉเจคเฉ เจเจพเจฃเจเฉ - เจเจธ เจฒเจ เจ เจธเฉเจ เจเจฐเจพเจเจเฉ เจเจนเจจเจพเจ เจจเฉเฉฐ เจธเจฎเฉเจน, เจธเจฐเฉเจค เจชเฉฑเจคเจฟเจเจ เจฌเจพเจฐเฉ เจเจพเจฃเจเจพเจฐเฉ เจจเฉเฉฐ เจธเฉเจฐเฉฑเจเจฟเจ เจค เจเจฐเจฆเฉ เจนเฉเจเฅค
เจชเจฐ เจเฉฑเจฅเฉ เจคเจฟเฉฐเจจ เจฎเฉเจธเฉเจฌเจคเจพเจ เจธเจพเจกเฉ เจเจกเฉเจ เจเจฐ เจฐเจนเฉเจเจ เจนเจจ:
- เจชเฉเฉฑเจเจเจฟเฉฑเจ เจฆเฉ "เจธเจฌเจฐเฉเจเจฐเจธเจฟเจต" เจนเจฟเฉฑเจธเฉ เจตเจฟเฉฑเจ เจเจธ เจจเจพเจฒ เจเฉเฉฑเจฒ เจซเฉฐเจเจธเจผเจจ เจธเจผเจพเจฎเจฒ เจจเจนเฉเจ เจนเฉ เจธเจเจฆเฉ เจนเจจ
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 BY เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฆเจพ เจเฉฑเจ เจธเจงเจพเจฐเจจ เจคเจฐเฉเจเจพ เจนเฉ 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
เจนเฉเจฃ เจ เจธเฉเจ เจตเฉเจเจฆเฉ เจนเจพเจ เจเจฟ เจธเฉฐเจเจฟเจเจคเจฎเจ ID เจจเฉเฉฐ เจเฉเจเจธเจ เจตเจฟเฉฑเจ เจเจฟเจเจ เจฌเจฆเจฒเจฟเจ เจเจฟเจ เจธเฉ - เจคเจพเจ เจเฉ เจเจนเจจเจพเจ เจจเฉเฉฐ เจเจพเจฎเจฟเจเจ เจฆเฉเจเจฐเจพ เจตเฉฑเจ เจเฉเจคเจพ เจเจพ เจธเจเฉ!
เจเจฆเจฎ 3
เจซเจพเจเจจเจฒ เจฒเจ เจธเจพเจกเฉ เจเฉเจฒ เจเฉเจ เจจเจนเฉเจ เจฌเจเจฟเจ เจนเฉ:
- เจ เจธเฉเจ เจธเจฎเฉเจน เจเจเจกเฉ เจฆเฉ เจธเฉเฉฑเจ เจฆเฉ เจเจงเจพเจฐ 'เจคเฉ "เจธเฉเจเจธเจผเจจ" เจฐเจฟเจเจพเจฐเจก เจชเฉเฉเจนเจฆเฉ เจนเจพเจ
- เจ เจธเฉเจ เจเจเจพเจ เจเจ เจญเจพเจเจพเจ เจฆเฉ เจฎเฉเจฒ เจธเจผเฉเจเจพเจ เจฆเฉ "เจธเฉเจเจพเจ" เจจเจพเจฒ เจคเฉเจฒเจจเจพ เจเจฐเจฆเฉ เจนเจพเจ
- เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจธเฉเฉฑเจ-เจธเจเฉเจฐเจฟเฉฐเจ เจฆเจพ "เจชเจธเจพเจฐ" เจเจฐเฉ
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