PostgreSQL Antipatterns: แƒ แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“ แƒฆแƒ แƒ›แƒแƒ แƒ™แƒฃแƒ แƒ“แƒฆแƒšแƒ˜แƒก แƒฎแƒ•แƒ แƒ”แƒšแƒ˜? แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒ˜แƒแƒ แƒแƒ— แƒ˜แƒ”แƒ แƒแƒ แƒฅแƒ˜แƒ

แƒ แƒ—แƒฃแƒš ERP แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ”แƒ‘แƒจแƒ˜ แƒ‘แƒ”แƒ•แƒ  แƒ”แƒ แƒ—แƒ”แƒฃแƒšแƒก แƒแƒฅแƒ•แƒก แƒ˜แƒ”แƒ แƒแƒ แƒฅแƒ˜แƒฃแƒšแƒ˜ แƒ‘แƒฃแƒœแƒ”แƒ‘แƒแƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ”แƒ แƒ—แƒ’แƒ•แƒแƒ แƒแƒ•แƒแƒœแƒ˜ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜ แƒ แƒ˜แƒ’แƒ“แƒ”แƒ‘แƒ แƒฌแƒ˜แƒœแƒแƒžแƒแƒ -แƒจแƒ—แƒแƒ›แƒแƒ›แƒแƒ•แƒšแƒแƒ‘แƒ˜แƒก แƒฃแƒ แƒ—แƒ˜แƒ”แƒ แƒ—แƒแƒ‘แƒ˜แƒก แƒฎแƒ” - แƒ”แƒก แƒแƒ แƒ˜แƒก แƒกแƒแƒฌแƒแƒ แƒ›แƒแƒก แƒแƒ แƒ’แƒแƒœแƒ˜แƒ–แƒแƒชแƒ˜แƒฃแƒšแƒ˜ แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ (แƒงแƒ•แƒ”แƒšแƒ แƒ”แƒก แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ˜, แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒ แƒ“แƒ แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒฏแƒ’แƒฃแƒคแƒ”แƒ‘แƒ˜) แƒ“แƒ แƒกแƒแƒฅแƒแƒœแƒšแƒ˜แƒก แƒ™แƒแƒขแƒแƒšแƒแƒ’แƒ˜, แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒกแƒคแƒ”แƒ แƒแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ’แƒแƒงแƒ˜แƒ“แƒ•แƒ”แƒ‘แƒ˜แƒก แƒžแƒฃแƒœแƒฅแƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒ”แƒแƒ’แƒ แƒแƒคแƒ˜แƒ,...

PostgreSQL Antipatterns: แƒ แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“ แƒฆแƒ แƒ›แƒแƒ แƒ™แƒฃแƒ แƒ“แƒฆแƒšแƒ˜แƒก แƒฎแƒ•แƒ แƒ”แƒšแƒ˜? แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒ˜แƒแƒ แƒแƒ— แƒ˜แƒ”แƒ แƒแƒ แƒฅแƒ˜แƒ

แƒคแƒแƒฅแƒขแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“, แƒแƒ แƒชแƒ”แƒ แƒ—แƒ˜ แƒแƒ  แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒ‘แƒ˜แƒ–แƒœแƒ”แƒกแƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒกแƒคแƒ”แƒ แƒแƒ”แƒ‘แƒ˜, แƒกแƒแƒ“แƒแƒช แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“ แƒแƒ  แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ แƒแƒ˜แƒ›แƒ” แƒ˜แƒ”แƒ แƒแƒ แƒฅแƒ˜แƒ. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒแƒจแƒ˜แƒœแƒแƒช แƒ™แƒ˜, แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ— "แƒ‘แƒ˜แƒ–แƒœแƒ”แƒกแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก", แƒ—แƒฅแƒ•แƒ”แƒœ แƒ›แƒแƒ˜แƒœแƒช แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒแƒ“ แƒจแƒ”แƒฎแƒ•แƒ“แƒ”แƒ— แƒ˜แƒ”แƒ แƒแƒ แƒฅแƒ˜แƒฃแƒš แƒฃแƒ แƒ—แƒ˜แƒ”แƒ แƒ—แƒแƒ‘แƒ”แƒ‘แƒก. แƒ”แƒก แƒ‘แƒแƒœแƒแƒšแƒฃแƒ แƒ˜แƒ, แƒ—แƒฃแƒœแƒ“แƒแƒช แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒแƒฏแƒแƒฎแƒ˜แƒก แƒฎแƒ” แƒแƒœ แƒจแƒ”แƒœแƒแƒ‘แƒ˜แƒก แƒ˜แƒแƒขแƒแƒ™แƒ˜แƒก แƒ’แƒ”แƒ’แƒ›แƒ แƒกแƒแƒ•แƒแƒญแƒ แƒ แƒชแƒ”แƒœแƒขแƒ แƒจแƒ˜ แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒแƒ.

แƒแƒกแƒ”แƒ—แƒ˜ แƒฎแƒ˜แƒก DBMS-แƒจแƒ˜ แƒจแƒ”แƒกแƒแƒœแƒแƒฎแƒแƒ“ แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒ’แƒ–แƒ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ“แƒฆแƒ”แƒก แƒฉแƒ•แƒ”แƒœ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ— แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ–แƒ” แƒ’แƒแƒ•แƒแƒ›แƒแƒฎแƒ•แƒ˜แƒšแƒ”แƒ‘แƒ— แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒแƒก:

CREATE TABLE hier(
  id
    integer
      PRIMARY KEY
, pid
    integer
      REFERENCES hier
, data
    json
);

CREATE INDEX ON hier(pid); -- ะฝะต ะทะฐะฑั‹ะฒะฐะตะผ, ั‡ั‚ะพ FK ะฝะต ะฟะพะดั€ะฐะทัƒะผะตะฒะฐะตั‚ ะฐะฒั‚ะพัะพะทะดะฐะฝะธะต ะธะฝะดะตะบัะฐ, ะฒ ะพั‚ะปะธั‡ะธะต ะพั‚ PK

แƒ“แƒ แƒกแƒแƒœแƒแƒ› แƒ˜แƒ”แƒ แƒแƒ แƒฅแƒ˜แƒ˜แƒก แƒกแƒ˜แƒฆแƒ แƒ›แƒ”แƒจแƒ˜ แƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ˜แƒ—, แƒ˜แƒก แƒ›แƒแƒ—แƒ›แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ”แƒšแƒแƒ“แƒ”แƒ‘แƒ, แƒ—แƒฃ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“ [แƒแƒ แƒแƒ”แƒคแƒ”แƒฅแƒขแƒฃแƒ แƒ˜] แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒแƒกแƒ”แƒ— แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒแƒกแƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ โ€žแƒ’แƒฃแƒšแƒฃแƒ‘แƒ แƒงแƒ•แƒ˜แƒšแƒโ€œ แƒ’แƒ–แƒ”แƒ‘แƒ˜.

PostgreSQL Antipatterns: แƒ แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“ แƒฆแƒ แƒ›แƒแƒ แƒ™แƒฃแƒ แƒ“แƒฆแƒšแƒ˜แƒก แƒฎแƒ•แƒ แƒ”แƒšแƒ˜? แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒ˜แƒแƒ แƒแƒ— แƒ˜แƒ”แƒ แƒแƒ แƒฅแƒ˜แƒ
แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ“แƒแƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒฌแƒแƒ แƒ›แƒแƒจแƒแƒ‘แƒ˜แƒš แƒขแƒ˜แƒžแƒฃแƒ  แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒก, แƒ›แƒแƒ— แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒแƒก SQL-แƒจแƒ˜ แƒ“แƒ แƒจแƒ”แƒ•แƒ”แƒชแƒแƒ“แƒแƒ— แƒ’แƒแƒ•แƒแƒฃแƒ›แƒฏแƒแƒ‘แƒ”แƒกแƒแƒ— แƒ›แƒแƒ—แƒ˜ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ.

#1. แƒ แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“ แƒฆแƒ แƒ›แƒแƒ แƒ™แƒฃแƒ แƒ“แƒฆแƒšแƒ˜แƒก แƒฎแƒ•แƒ แƒ”แƒšแƒ˜?

แƒ›แƒแƒ“แƒ˜แƒ—, แƒ“แƒแƒ–แƒฃแƒกแƒขแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒแƒ—, แƒ แƒแƒ› แƒ”แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ แƒแƒ˜แƒกแƒแƒฎแƒ”แƒ‘แƒ แƒแƒ แƒ’แƒแƒœแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒแƒจแƒ˜ แƒ“แƒ”แƒžแƒแƒ แƒขแƒแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒฅแƒ•แƒ”แƒ›แƒ“แƒ”แƒ‘แƒแƒ แƒ”แƒ‘แƒแƒจแƒ˜: แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜, แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜, แƒกแƒ”แƒฅแƒขแƒแƒ แƒ”แƒ‘แƒ˜, แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒ”แƒ‘แƒ˜, แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒฏแƒ’แƒฃแƒคแƒ”แƒ‘แƒ˜... - แƒ แƒแƒกแƒแƒช แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒฌแƒแƒ“แƒ”แƒ‘แƒ— แƒ›แƒแƒ—.
PostgreSQL Antipatterns: แƒ แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“ แƒฆแƒ แƒ›แƒแƒ แƒ™แƒฃแƒ แƒ“แƒฆแƒšแƒ˜แƒก แƒฎแƒ•แƒ แƒ”แƒšแƒ˜? แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒ˜แƒแƒ แƒแƒ— แƒ˜แƒ”แƒ แƒแƒ แƒฅแƒ˜แƒ

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜, แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ "แƒฎแƒ”" 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

แƒแƒ› แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ— แƒขแƒ˜แƒžแƒ˜แƒฃแƒ แƒ˜ แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒฃแƒšแƒ˜ JOIN:
PostgreSQL Antipatterns: แƒ แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“ แƒฆแƒ แƒ›แƒแƒ แƒ™แƒฃแƒ แƒ“แƒฆแƒšแƒ˜แƒก แƒฎแƒ•แƒ แƒ”แƒšแƒ˜? แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒ˜แƒแƒ แƒแƒ— แƒ˜แƒ”แƒ แƒแƒ แƒฅแƒ˜แƒ

แƒชแƒฎแƒแƒ“แƒ˜แƒ, แƒแƒ› แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒ— แƒ’แƒแƒ›แƒ”แƒแƒ แƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ แƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ แƒจแƒ—แƒแƒ›แƒแƒ›แƒแƒ•แƒšแƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒ”แƒ แƒ—แƒ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒแƒก (แƒ“แƒ แƒ›แƒแƒ—แƒ’แƒแƒœ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒแƒ—แƒ”แƒฃแƒšแƒ˜แƒ) แƒ“แƒ แƒแƒ›แƒแƒก แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒกแƒญแƒ˜แƒ แƒ“แƒ”แƒก แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜ แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜ แƒ“แƒ, แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“, แƒ“แƒ แƒ.

แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒแƒ›แƒแƒฌแƒ›แƒแƒ— "แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒคแƒแƒ แƒ—แƒ" แƒฅแƒ•แƒ”แƒฎแƒ”:

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;

PostgreSQL Antipatterns: แƒ แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“ แƒฆแƒ แƒ›แƒแƒ แƒ™แƒฃแƒ แƒ“แƒฆแƒšแƒ˜แƒก แƒฎแƒ•แƒ แƒ”แƒšแƒ˜? แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒ˜แƒแƒ แƒแƒ— แƒ˜แƒ”แƒ แƒแƒ แƒฅแƒ˜แƒ
[แƒœแƒแƒฎแƒ”แƒ— description.tensor.ru]

แƒ แƒแƒ’แƒแƒ แƒช แƒ›แƒแƒกแƒแƒšแƒแƒ“แƒœแƒ”แƒšแƒ˜ แƒ˜แƒงแƒ, 30-แƒ•แƒ” แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ แƒ•แƒ˜แƒžแƒแƒ•แƒ”แƒ—. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒแƒ— แƒ›แƒ—แƒšแƒ˜แƒแƒœแƒ˜ แƒ“แƒ แƒแƒ˜แƒก 60% แƒ“แƒแƒฎแƒแƒ แƒฏแƒ”แƒก แƒแƒ›แƒแƒ–แƒ” - แƒ แƒแƒ“แƒ’แƒแƒœ แƒ›แƒแƒ— แƒแƒกแƒ”แƒ•แƒ” แƒ’แƒแƒแƒ™แƒ”แƒ—แƒ”แƒก 30 แƒซแƒ˜แƒ”แƒ‘แƒ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒจแƒ˜. แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ—แƒฃ แƒแƒ แƒ แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ?

แƒœแƒแƒงแƒแƒ แƒ˜ แƒ™แƒแƒ แƒ”แƒฅแƒขแƒ˜แƒ แƒ”แƒ‘แƒ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜แƒ—

แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ—แƒฃ แƒแƒ แƒ แƒชแƒแƒšแƒ™แƒ” แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ™แƒ•แƒแƒœแƒซแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก? แƒ’แƒแƒ›แƒแƒ“แƒ˜แƒก, แƒ แƒแƒ› แƒแƒ แƒ - แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒฌแƒแƒ•แƒ˜แƒ™แƒ˜แƒ—แƒฎแƒแƒ— แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜แƒ“แƒแƒœ แƒ”แƒ แƒ—แƒ“แƒ แƒแƒฃแƒšแƒแƒ“ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ™แƒšแƒแƒ•แƒ˜แƒจแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒ”แƒ แƒ— แƒ–แƒแƒ แƒ–แƒ” via = ANY(array).

แƒ˜แƒ“แƒ”แƒœแƒขแƒ˜แƒคแƒ˜แƒ™แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒแƒกแƒ”แƒ— แƒฏแƒ’แƒฃแƒคแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒแƒ•แƒ˜แƒฆแƒแƒ— แƒฌแƒ˜แƒœแƒ แƒ”แƒขแƒแƒžแƒ–แƒ” แƒœแƒแƒžแƒแƒ•แƒœแƒ˜ แƒงแƒ•แƒ”แƒšแƒ ID-แƒ”แƒ‘แƒ˜ "แƒ™แƒ•แƒแƒœแƒซแƒ”แƒ‘แƒ˜แƒก" แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—. แƒแƒœแƒฃ, แƒงแƒแƒ•แƒ”แƒš แƒ›แƒแƒ›แƒ“แƒ”แƒ•แƒœแƒ แƒ”แƒขแƒแƒžแƒ–แƒ” แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ— แƒ›แƒแƒซแƒ”แƒ‘แƒœแƒ”แƒ— แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒšแƒ˜ แƒ“แƒแƒœแƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒจแƒ—แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒ”แƒ แƒ—แƒ“แƒ แƒแƒฃแƒšแƒแƒ“.

แƒ›แƒฎแƒแƒšแƒแƒ“ แƒแƒฅ แƒแƒ แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ, แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒฃแƒšแƒ˜ แƒจแƒ”แƒ แƒฉแƒ”แƒ•แƒ˜แƒกแƒแƒก, แƒ—แƒฅแƒ•แƒ”แƒœ แƒ•แƒ”แƒ  แƒจแƒ”แƒซแƒšแƒ”แƒ‘แƒ— แƒกแƒแƒ™แƒฃแƒ—แƒแƒ  แƒ—แƒแƒ•แƒก แƒฌแƒ•แƒ“แƒแƒ›แƒแƒก แƒฌแƒงแƒแƒ‘แƒ˜แƒš แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒจแƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœ แƒ แƒแƒ’แƒแƒ แƒ›แƒ” แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒ•แƒแƒ แƒฉแƒ˜แƒแƒ— แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ˜แƒก, แƒ แƒแƒช แƒฌแƒ˜แƒœแƒ แƒ“แƒแƒœแƒ”แƒ–แƒ” แƒ˜แƒงแƒ แƒœแƒแƒžแƒแƒ•แƒœแƒ˜... แƒ’แƒแƒ›แƒแƒ“แƒ˜แƒก, แƒ แƒแƒ› แƒจแƒ”แƒฃแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒ’แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ แƒ›แƒ—แƒ”แƒšแƒ˜ แƒกแƒ”แƒšแƒ”แƒฅแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ˜แƒกแƒ˜ แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒ˜ แƒ•แƒ”แƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ. แƒ“แƒ แƒ”แƒก แƒ•แƒ”แƒšแƒ˜ แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ˜แƒงแƒแƒก แƒ›แƒแƒกแƒ˜แƒ•แƒ˜ - แƒ แƒแƒช แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ— ANY.

แƒชแƒแƒขแƒ แƒ’แƒ˜แƒŸแƒฃแƒ แƒแƒ“ แƒŸแƒฆแƒ”แƒ แƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ“แƒ˜แƒแƒ’แƒ แƒแƒ›แƒแƒจแƒ˜ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ.

PostgreSQL Antipatterns: แƒ แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“ แƒฆแƒ แƒ›แƒแƒ แƒ™แƒฃแƒ แƒ“แƒฆแƒšแƒ˜แƒก แƒฎแƒ•แƒ แƒ”แƒšแƒ˜? แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒ˜แƒแƒ แƒแƒ— แƒ˜แƒ”แƒ แƒแƒ แƒฅแƒ˜แƒ

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;

PostgreSQL Antipatterns: แƒ แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“ แƒฆแƒ แƒ›แƒแƒ แƒ™แƒฃแƒ แƒ“แƒฆแƒšแƒ˜แƒก แƒฎแƒ•แƒ แƒ”แƒšแƒ˜? แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒ˜แƒแƒ แƒแƒ— แƒ˜แƒ”แƒ แƒแƒ แƒฅแƒ˜แƒ
[แƒœแƒแƒฎแƒ”แƒ— description.tensor.ru]

แƒ“แƒ แƒแƒฅ แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜ แƒ˜แƒก แƒ™แƒ˜ แƒแƒ แƒแƒ แƒ›แƒแƒ˜แƒ’แƒ”แƒ— 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, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ›แƒแƒ’แƒ•แƒชแƒ”แƒ›แƒก แƒ“แƒแƒฃแƒงแƒแƒ•แƒœแƒ”แƒ‘แƒšแƒ˜แƒ• แƒจแƒ”แƒ•แƒ˜แƒ“แƒ”แƒ— แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒฃแƒšแƒ˜ โ€žแƒชแƒฎแƒ แƒ˜แƒšแƒ˜แƒกโ€œ แƒ•แƒ”แƒšแƒ”แƒ‘แƒ–แƒ” แƒ“แƒ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ— แƒแƒ’แƒ แƒ”แƒ’แƒแƒขแƒฃแƒšแƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒคแƒ˜แƒšแƒขแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒžแƒ˜แƒ แƒแƒ‘แƒ˜แƒ— แƒ™แƒ•แƒแƒœแƒซแƒ–แƒ” แƒ“แƒแƒคแƒฃแƒซแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒ›แƒชแƒ˜แƒ แƒ”แƒ‘แƒšแƒแƒ“:

PostgreSQL Antipatterns: แƒ แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“ แƒฆแƒ แƒ›แƒแƒ แƒ™แƒฃแƒ แƒ“แƒฆแƒšแƒ˜แƒก แƒฎแƒ•แƒ แƒ”แƒšแƒ˜? แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒ˜แƒแƒ แƒแƒ— แƒ˜แƒ”แƒ แƒแƒ แƒฅแƒ˜แƒ

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;

PostgreSQL Antipatterns: แƒ แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“ แƒฆแƒ แƒ›แƒแƒ แƒ™แƒฃแƒ แƒ“แƒฆแƒšแƒ˜แƒก แƒฎแƒ•แƒ แƒ”แƒšแƒ˜? แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒ˜แƒแƒ แƒแƒ— แƒ˜แƒ”แƒ แƒแƒ แƒฅแƒ˜แƒ
[แƒœแƒแƒฎแƒ”แƒ— description.tensor.ru]

แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ•แƒซแƒ”แƒšแƒ˜แƒ— แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ”แƒ แƒ—แƒ˜ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜แƒก แƒ–แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒชแƒ˜แƒ แƒ”แƒ‘แƒ แƒ“แƒ แƒ›แƒแƒ˜แƒ’แƒ 2-แƒฏแƒ”แƒ  แƒ›แƒ”แƒขแƒ˜ แƒ›แƒแƒชแƒฃแƒšแƒแƒ‘แƒ˜แƒ— แƒ™แƒแƒ แƒ”แƒฅแƒขแƒแƒ แƒ˜.

#2. แƒ“แƒแƒ•แƒฃแƒ‘แƒ แƒฃแƒœแƒ“แƒ”แƒ— แƒคแƒ”แƒกแƒ•แƒ”แƒ‘แƒก

แƒ”แƒก แƒแƒšแƒ’แƒแƒ แƒ˜แƒ—แƒ›แƒ˜ แƒ’แƒแƒ›แƒแƒ’แƒแƒ“แƒ’แƒ”แƒ‘แƒแƒ—, แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒแƒ’แƒ แƒแƒ•แƒแƒ— แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜ แƒงแƒ•แƒ”แƒšแƒ แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก โ€žแƒฎแƒ”แƒ–แƒ” แƒ›แƒแƒฆแƒšแƒโ€œ, แƒฎแƒแƒšแƒ แƒจแƒ”แƒ˜แƒœแƒแƒ แƒฉแƒฃแƒœแƒแƒ— แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ แƒ˜แƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘, แƒ—แƒฃ แƒ แƒแƒ›แƒ”แƒšแƒ˜ แƒฌแƒงแƒแƒ แƒแƒก แƒคแƒฃแƒ แƒชแƒ”แƒšแƒ˜ (แƒ“แƒ แƒ แƒ แƒ˜แƒœแƒ“แƒ˜แƒ™แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒ—) แƒ’แƒแƒ›แƒแƒ˜แƒฌแƒ•แƒ˜แƒ แƒœแƒ˜แƒ›แƒฃแƒจแƒจแƒ˜ แƒ›แƒ˜แƒกแƒ˜ แƒฉแƒแƒ แƒ—แƒ•แƒ - แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒจแƒ”แƒ›แƒแƒฏแƒแƒ›แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ˜แƒก แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒ. แƒ™แƒ•แƒแƒœแƒซแƒ”แƒ‘แƒแƒ“ แƒ’แƒแƒ”แƒ แƒ—แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒ—.

PostgreSQL Antipatterns: แƒ แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“ แƒฆแƒ แƒ›แƒแƒ แƒ™แƒฃแƒ แƒ“แƒฆแƒšแƒ˜แƒก แƒฎแƒ•แƒ แƒ”แƒšแƒ˜? แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒ˜แƒแƒ แƒแƒ— แƒ˜แƒ”แƒ แƒแƒ แƒฅแƒ˜แƒ
แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜, แƒฃแƒœแƒ“แƒ แƒ˜แƒฅแƒœแƒแƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒฎแƒแƒšแƒแƒ“, แƒ แƒแƒ’แƒแƒ แƒช แƒ™แƒแƒœแƒชแƒ”แƒคแƒชแƒ˜แƒ˜แƒก แƒ“แƒแƒ›แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒกแƒแƒ‘แƒฃแƒ—แƒ˜, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒแƒฆแƒ›แƒแƒฉแƒœแƒ“แƒ”แƒ‘แƒ แƒซแƒแƒšแƒ˜แƒแƒœ แƒ แƒ—แƒฃแƒšแƒ˜. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ—แƒฃ แƒ˜แƒก แƒ“แƒแƒ›แƒ˜แƒœแƒ˜แƒ แƒ”แƒ‘แƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜, แƒฃแƒœแƒ“แƒ แƒ˜แƒคแƒ˜แƒฅแƒ แƒแƒ— แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒขแƒ”แƒฅแƒœแƒ˜แƒ™แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒแƒ–แƒ”.

แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒแƒ— แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ’แƒแƒœแƒชแƒฎแƒแƒ“แƒ”แƒ‘แƒ˜แƒ—:

  • แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒ“แƒแƒœ แƒฏแƒแƒ‘แƒ˜แƒ แƒ”แƒ แƒ—แƒฎแƒ”แƒš แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒ.
  • แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒ“แƒแƒœ แƒฏแƒ’แƒฃแƒคแƒฃแƒ แƒแƒ“ แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒ แƒฃแƒคแƒ แƒ แƒ”แƒคแƒ”แƒฅแƒขแƒฃแƒ แƒ˜แƒแƒ•แƒ˜แƒ“แƒ แƒ” แƒ›แƒแƒ แƒขแƒ.

แƒแƒฎแƒšแƒ แƒจแƒ”แƒ•แƒ”แƒชแƒแƒ“แƒแƒ— แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒกแƒแƒญแƒ˜แƒ แƒ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ.

แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ 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

แƒแƒฎแƒšแƒ แƒฉแƒ•แƒ”แƒœ แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก ID-แƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒ›แƒžแƒšแƒ”แƒฅแƒขแƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ› แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒแƒก แƒกแƒแƒญแƒ˜แƒ แƒแƒ”แƒ‘แƒก. แƒ—แƒ˜แƒ—แƒฅแƒ›แƒ˜แƒก แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ“แƒฃแƒ‘แƒšแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒแƒ แƒ˜แƒ’แƒ˜แƒœแƒแƒšแƒฃแƒ แƒ˜ แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜แƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒจแƒ˜ - แƒแƒกแƒ” แƒ›แƒแƒ•แƒ˜แƒฅแƒชแƒ”แƒ•แƒ˜แƒ— แƒ“แƒแƒแƒฏแƒ’แƒฃแƒคแƒ” แƒ˜แƒกแƒ˜แƒœแƒ˜, แƒฌแƒงแƒแƒ แƒแƒก แƒคแƒแƒ—แƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒœแƒแƒ แƒฉแƒฃแƒœแƒ”แƒ‘แƒ˜แƒกแƒแƒก.

แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒฅ แƒกแƒแƒ›แƒ˜ แƒฃแƒ‘แƒ”แƒ“แƒฃแƒ แƒ”แƒ‘แƒ แƒ’แƒ•แƒ”แƒšแƒแƒ“แƒ”แƒ‘แƒ:

  1. แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก "แƒกแƒฃแƒ‘แƒ™แƒฃแƒ แƒกแƒ˜แƒฃแƒšแƒ˜" แƒœแƒแƒฌแƒ˜แƒšแƒ˜ แƒแƒ  แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒ“แƒ”แƒก แƒแƒ’แƒ แƒ”แƒ’แƒแƒขแƒฃแƒš แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒก GROUP BY.
  2. แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒฃแƒš โ€žแƒชแƒฎแƒ แƒ˜แƒšแƒ–แƒ”โ€œ แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒ แƒแƒ  แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ˜แƒงแƒแƒก แƒฉแƒแƒ“แƒ’แƒ›แƒฃแƒš แƒฅแƒ•แƒ”แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒจแƒ˜.
  3. แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒฃแƒš แƒœแƒแƒฌแƒ˜แƒšแƒจแƒ˜ แƒแƒ  แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒ“แƒ”แƒก CTE-แƒก.

แƒกแƒแƒ‘แƒ”แƒ“แƒœแƒ˜แƒ”แƒ แƒแƒ“, แƒงแƒ•แƒ”แƒšแƒ แƒแƒ› แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ˜แƒก แƒ›แƒแƒ’แƒ•แƒแƒ แƒ”แƒ‘แƒ แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ. แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒแƒ— แƒ‘แƒแƒšแƒแƒ“แƒแƒœ.

CTE แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒฃแƒš แƒœแƒแƒฌแƒ˜แƒšแƒจแƒ˜

แƒแƒฅ แƒแƒกแƒ” แƒแƒ แƒแƒ แƒ˜แƒก แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก:

WITH RECURSIVE tree AS (
  ...
UNION ALL
  WITH T (...)
  SELECT ...
)

แƒ“แƒ แƒแƒกแƒ” แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก, แƒคแƒ แƒฉแƒฎแƒ˜แƒšแƒ”แƒ‘แƒ˜ แƒฅแƒ›แƒœแƒ˜แƒก แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒแƒก!

WITH RECURSIVE tree AS (
  ...
UNION ALL
  (
    WITH T (...)
    SELECT ...
  )
)

แƒฉแƒแƒ“แƒ’แƒ›แƒฃแƒšแƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒฃแƒšแƒ˜ โ€žแƒชแƒฎแƒ แƒ˜แƒšแƒ˜แƒกโ€œ แƒฌแƒ˜แƒœแƒแƒแƒฆแƒ›แƒ“แƒ”แƒ’

แƒฐแƒ›... แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒฃแƒš CTE-แƒ–แƒ” แƒฌแƒ•แƒ“แƒแƒ›แƒ แƒจแƒ”แƒฃแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒฅแƒ•แƒ”แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒจแƒ˜. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ”แƒก แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ˜แƒงแƒแƒก CTE แƒจแƒ˜แƒ’แƒœแƒ˜แƒ—! แƒ“แƒ แƒฉแƒแƒ“แƒ’แƒ›แƒฃแƒš แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒก แƒฃแƒ™แƒ•แƒ” แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒแƒ› CTE-แƒ–แƒ” แƒฌแƒ•แƒ“แƒแƒ›แƒ!

GROUP BY แƒจแƒ˜แƒ“แƒ แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—

แƒฃแƒกแƒ˜แƒแƒ›แƒแƒ•แƒœแƒแƒ, แƒ›แƒแƒ’แƒ แƒแƒ›... แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒแƒฅแƒ•แƒก 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

แƒคแƒ˜แƒœแƒแƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒ แƒแƒคแƒ”แƒ แƒ˜ แƒ“แƒแƒ’แƒ•แƒ แƒฉแƒ”แƒœแƒ˜แƒ:

  • แƒฉแƒ•แƒ”แƒœ แƒ•แƒ™แƒ˜แƒ—แƒฎแƒฃแƒšแƒแƒ‘แƒ— โ€žแƒกแƒ”แƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒกโ€œ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒก แƒ“แƒแƒฏแƒ’แƒฃแƒคแƒ”แƒ‘แƒฃแƒšแƒ˜ ID-แƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒคแƒฃแƒซแƒ•แƒ”แƒšแƒ–แƒ”
  • แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ“แƒแƒ แƒ”แƒ‘แƒ— แƒ’แƒแƒ›แƒแƒ™แƒšแƒ”แƒ‘แƒฃแƒš แƒ›แƒแƒœแƒแƒ™แƒ•แƒ”แƒ—แƒ”แƒ‘แƒก แƒแƒ แƒ˜แƒ’แƒ˜แƒœแƒแƒšแƒฃแƒ แƒ˜ แƒคแƒฃแƒ แƒชแƒšแƒ”แƒ‘แƒ˜แƒก โ€žแƒ™แƒแƒ›แƒžแƒšแƒ”แƒฅแƒขแƒ”แƒ‘แƒกโ€œ.
  • "แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ" set-string แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— 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;

PostgreSQL Antipatterns: แƒ แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“ แƒฆแƒ แƒ›แƒแƒ แƒ™แƒฃแƒ แƒ“แƒฆแƒšแƒ˜แƒก แƒฎแƒ•แƒ แƒ”แƒšแƒ˜? แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒ˜แƒแƒ แƒแƒ— แƒ˜แƒ”แƒ แƒแƒ แƒฅแƒ˜แƒ
[แƒœแƒแƒฎแƒ”แƒ— description.tensor.ru]

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ