เดเดเตเดเดพเดฐเตเดฏเดคเตเดคเดฟเตฝ เดกเดฟเดฌเดฟเดเดเดเดธเต เดเดฐเต เดคเดคเตเดคเตเดตเดเตเดเดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเต - "เด
เดตเตผ เดเดจเตเดจเตเดเต เดเตเดดเดฟเดเตเดเดพเตป เดชเดฑเดเตเดเต, เด
เดคเดฟเดจเดพเตฝ เดเดพเตป เดเตเดดเดฟเดเตเดเตเดจเตเดจเต". เดจเดฟเดเตเดเดณเตเดเต เด
เดญเตเดฏเตผเดคเตเดฅเดจ เด
เดฏเตฝ เดชเตเดฐเดเตเดฐเดฟเดฏเดเดณเต เดฎเดจเตเดฆเดเดคเดฟเดฏเดฟเดฒเดพเดเตเดเดพเตป เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เดชเตเดฐเตเดธเดธเตผ เดเดฑเดตเดฟเดเดเตเดเตพ เดจเดฟเดฐเดจเตเดคเดฐเด เดเดฑเตเดฑเตเดเตเดเตเดเดพเดจเตเด เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เดฎเตเดดเตเดตเตป เดกเดพเดฑเตเดฑเดพเดฌเตเดธเตเด "เดกเตเดฐเตเดชเตเดชเต" เดเตเดฏเตเดฏเดพเดจเตเด, เดฒเดญเตเดฏเดฎเดพเดฏ เดเดฒเตเดฒเดพ เดฎเตเดฎเตเดฎเดฑเดฟเดฏเตเด "เดคเดฟเดจเตเดจเดพเดจเตเด" เดเดดเดฟเดฏเตเด. เด
เดจเดจเตเดคเดฎเดพเดฏ เดเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเตเดคเดฟเดฐเดพเดฏ เดธเดเดฐเดเตเดทเดฃเด - เดกเดตเดฒเดชเตเดชเดฑเตเดเต เดคเดจเตเดจเต เดเดคเตเดคเดฐเดตเดพเดฆเดฟเดคเตเดคเด.
PostgreSQL-เตฝ, เดตเดดเดฟ เดเดตเตผเดคเตเดคเดจ เดเตเดฆเตเดฏเดเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเดพเดจเตเดณเตเดณ เดเดดเดฟเดตเต WITH RECURSIVE
เดเดตเตผเดคเตเดคเดจ เดเตเดฆเตเดฏเดเตเดเตพ เดเดดเตเดคเดฐเตเดคเต
เดเตเดเดพเดคเต เดเดตเตผเดคเตเดคเดจเดฎเดฟเดฒเตเดฒเดพเดคเตเดคเดต เดเดดเตเดคเตเด. เดเดคเตเดฎเดพเตผเดคเตเดฅเดคเดฏเตเดเต, เดจเดฟเดเตเดเดณเตเดเต เดเต.เด.
เดตเดพเดธเตเดคเดตเดคเตเดคเดฟเตฝ, PostgreSQL เดจเดฟเดเตเดเตพเดเตเดเต เดเดชเดฏเตเดเดฟเดเตเดเดพเดจเดพเดเตเดจเตเดจ เดงเดพเดฐเดพเดณเด เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดเตพ เดจเตฝเดเตเดจเตเดจเต เด เดฒเตเดฒ เดเดตเตผเดคเตเดคเดจเด เดชเตเดฐเดฏเตเดเดฟเดเตเดเตเด.
เดชเตเดฐเดถเตเดจเดคเตเดคเดฟเดจเต เด เดเดฟเดธเตเดฅเดพเดจเดชเดฐเดฎเดพเดฏเดฟ เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏ เดธเดฎเตเดชเดจเด เดเดชเดฏเตเดเดฟเดเตเดเตเด
เดเดฟเดฒเดชเตเดชเตเตพ เดจเดฟเดเตเดเตพเดเตเดเต "เดตเตเดฏเดคเตเดฏเดธเตเดค เดตเดถเดคเตเดคเต" เดจเดฟเดจเตเดจเต เดชเตเดฐเดถเตเดจเด เดจเตเดเตเดเดพเด. เด
เดคเตเดคเดฐเดฎเตเดฐเต เดธเดพเดนเดเดฐเตเดฏเดคเตเดคเดฟเดจเตเดฑเต เดเดฐเต เดเดฆเดพเดนเดฐเดฃเด เดเดพเตป เดฒเตเดเดจเดคเตเดคเดฟเตฝ เดจเตฝเดเดฟ
WITH RECURSIVE src AS (
SELECT '{2,3,5,7,11,13,17,19}'::integer[] arr
)
, T(i, val) AS (
SELECT
1::bigint
, 1
UNION ALL
SELECT
i + 1
, val * arr[i]
FROM
T
, src
WHERE
i <= array_length(arr, 1)
)
SELECT
val
FROM
T
ORDER BY -- ะพัะฑะพั ัะธะฝะฐะปัะฝะพะณะพ ัะตะทัะปััะฐัะฐ
i DESC
LIMIT 1;
เด เด เดญเตเดฏเตผเดคเตเดฅเดจ เดเดฃเดฟเดคเดถเดพเดธเตเดคเตเดฐ เดตเดฟเดฆเดเตเดงเดฐเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดเดฐเต เดเดชเตเดทเตป เดเดชเดฏเตเดเดฟเดเตเดเต เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเดเตเดเดพเด:
WITH src AS (
SELECT unnest('{2,3,5,7,11,13,17,19}'::integer[]) prime
)
SELECT
exp(sum(ln(prime)))::integer val
FROM
src;
เดฒเตเดชเตเดชเตเดเตพเดเตเดเต เดชเดเดฐเด เดเดจเดฑเตเดฑเตเดฑเต_เดธเตเดฐเตเดธเต เดเดชเดฏเตเดเดฟเดเตเดเตเด
เดเดฐเต เดธเตโเดเตเดฐเดฟเดเตเดเดฟเดจเต เดธเดพเดงเตเดฏเดฎเดพเดฏ เดเดฒเตเดฒเดพ เดชเตเดฐเดฟเดซเดฟเดเตโเดธเตเดเดณเตเด เดธเตเดทเตโเดเดฟเดเตเดเดพเดจเตเดณเตเดณ เดเตเดฎเดคเดฒเดฏเดพเดฃเต เดเดเตเดเตพ เดจเตเดฐเดฟเดเตเดจเตเดจเดคเตเดจเตเดจเต เดชเดฑเดฏเดพเด 'abcdefgh'
:
WITH RECURSIVE T AS (
SELECT 'abcdefgh' str
UNION ALL
SELECT
substr(str, 1, length(str) - 1)
FROM
T
WHERE
length(str) > 1
)
TABLE T;
เดจเดฟเดเตเดเตพเดเตเดเต เดเดตเดฟเดเต เดเดตเตผเดคเตเดคเดจเด เดเดตเดถเตเดฏเดฎเดพเดฃเตเดจเตเดจเต เดเดฑเดชเตเดชเดพเดฃเต?.. เดจเดฟเดเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดเดฏเดพเดฃเตเดเตเดเดฟเตฝ LATERAL
ะธ generate_series
, เด
เดชเตเดชเตเตพ เดจเดฟเดเตเดเตพเดเตเดเต CTE เดชเตเดฒเตเด เดเดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ:
SELECT
substr(str, 1, ln) str
FROM
(VALUES('abcdefgh')) T(str)
, LATERAL(
SELECT generate_series(length(str), 1, -1) ln
) X;
เดกเดพเดฑเตเดฑเดพเดฌเตเดธเต เดเดเดจ เดฎเดพเดฑเตเดฑเตเด
เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดเดฐเตเดเต เดชเตเดฐเดคเดฟเดเดฐเดฟเดเตเดเดตเดฐเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดเดฃเดเตเดทเดจเตเดเดณเตเดณเตเดณ เดซเตเดฑเด เดธเดจเตเดฆเตเดถเดเตเดเดณเตเดเต เดเดฐเต เดชเดเตเดเดฟเด เด
เดฒเตเดฒเตเดเตเดเดฟเตฝ เดเดฐเต เดคเตเดฐเตเดกเต เดจเดฟเดเตเดเดณเตเดเต เดชเดเตเดเดฒเตเดฃเตเดเต
CREATE TABLE message(
message_id
uuid
PRIMARY KEY
, reply_to
uuid
REFERENCES message
, body
text
);
CREATE INDEX ON message(reply_to);
เดถเดฐเดฟ, เดเดฐเต เดตเดฟเดทเดฏเดคเตเดคเดฟเตฝ เดเดฒเตเดฒเดพ เดธเดจเตเดฆเตเดถเดเตเดเดณเตเด เดกเตเตบเดฒเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฐเต เดธเดพเดงเดพเดฐเดฃ เด
เดญเตเดฏเตผเดคเตเดฅเดจ เดเดคเตเดชเตเดฒเตเดฏเดพเดฃเต:
WITH RECURSIVE T AS (
SELECT
*
FROM
message
WHERE
message_id = $1
UNION ALL
SELECT
m.*
FROM
T
JOIN
message m
ON m.reply_to = T.message_id
)
TABLE T;
เดเดจเตเดจเดพเตฝ เดฑเตเดเตเดเต เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเตเดดเตเดตเตป เดตเดฟเดทเดฏเดตเตเด เดเดเตเดเตพเดเตเดเต เดเดฒเตเดฒเดพเดฏเตเดชเตเดชเตเดดเตเด เดเดตเดถเตเดฏเดฎเตเดณเตเดณเดคเดฟเดจเดพเตฝ, เดเดจเตเดคเตเดเตเดฃเตเดเต เดจเดฎเตเดเตเดเต เดตเตเดฃเตเด เดเดฐเต เดเตปเดเตเดฐเดฟเดฏเดฟเดฒเตเด เด เดคเดฟเดจเตเดฑเต เดเดกเดฟ เดเตเตผเดเตเดเตเด เดเดเตเดเตเดพเดฎเดพเดฑเตเดฑเดฟเดเต?
-- ะดะพะฑะฐะฒะธะผ ะฟะพะปะต ั ะพะฑัะธะผ ะธะดะตะฝัะธัะธะบะฐัะพัะพะผ ัะตะผั ะธ ะธะฝะดะตะบั ะฝะฐ ะฝะตะณะพ
ALTER TABLE message
ADD COLUMN theme_id uuid;
CREATE INDEX ON message(theme_id);
-- ะธะฝะธัะธะฐะปะธะทะธััะตะผ ะธะดะตะฝัะธัะธะบะฐัะพั ัะตะผั ะฒ ััะธะณะณะตัะต ะฟัะธ ะฒััะฐะฒะบะต
CREATE OR REPLACE FUNCTION ins() RETURNS TRIGGER AS $$
BEGIN
NEW.theme_id = CASE
WHEN NEW.reply_to IS NULL THEN NEW.message_id -- ะฑะตัะตะผ ะธะท ััะฐััะพะฒะพะณะพ ัะพะฑััะธั
ELSE ( -- ะธะปะธ ะธะท ัะพะพะฑัะตะฝะธั, ะฝะฐ ะบะพัะพัะพะต ะพัะฒะตัะฐะตะผ
SELECT
theme_id
FROM
message
WHERE
message_id = NEW.reply_to
)
END;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER ins BEFORE INSERT
ON message
FOR EACH ROW
EXECUTE PROCEDURE ins();
เดเดชเตเดชเตเตพ เดเดเตเดเดณเตเดเต เดฎเตเดดเตเดตเตป เดเดตเตผเดคเตเดคเดจ เด
เดจเตเดตเตเดทเดฃเดตเตเด เดเดคเดฟเดฒเตเดเตเดเต เดเตเดฐเตเดเตเดเดพเด:
SELECT
*
FROM
message
WHERE
theme_id = $1;
เดชเตเดฐเดฏเตเดเดฟเดเตเด "เดชเดฐเดฟเดงเดฟเดเตพ" เดเดชเดฏเตเดเดฟเดเตเดเตเด
เดเดฟเดฒ เดเดพเดฐเดฃเดเตเดเดณเดพเตฝ เดเดเตเดเตพเดเตเดเต เดกเดพเดฑเตเดฑเดพเดฌเตเดธเดฟเดจเตเดฑเต เดเดเดจ เดฎเดพเดฑเตเดฑเดพเตป เดเดดเดฟเดฏเตเดจเตเดจเดฟเดฒเตเดฒเตเดเตเดเดฟเตฝ, เดกเดพเดฑเตเดฑเดฏเดฟเดฒเต เดเดฐเต เดชเดฟเดถเดเดฟเดจเตเดฑเต เดธเดพเดจเตเดจเดฟเดงเตเดฏเด เดชเตเดฒเตเด เด เดจเดจเตเดคเดฎเดพเดฏ เดเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดฒเตเดเตเดเต เดจเดฏเดฟเดเตเดเดพเดคเดฟเดฐเดฟเดเตเดเดพเตป เดจเดฎเตเดเตเดเต เดเดถเตเดฐเดฏเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเตเดจเตเดจเดคเต เดเดจเตเดคเดพเดฃเตเดจเตเดจเต เดจเตเดเตเดเดพเด.
เดฑเดฟเดเตผเดทเตป เดกเตเดชเตเดคเต เดเตเดฃเตเดเตผ
เด เดชเดฐเตเดฏเดพเดชเตเดคเดฎเตเดจเตเดจเต เดเดเตเดเตพ เดเดฐเตเดคเตเดจเตเดจ เดเดฐเต เดชเดฐเดฟเดงเดฟเดฏเดฟเดฒเตเดคเตเดคเตเดจเตเดจเดคเต เดตเดฐเต เดเดฐเต เดเดตเตผเดคเตเดคเดจ เดเดเตเดเดคเตเดคเดฟเดฒเตเด เดเดเตเดเตพ เดเตเดฃเตเดเตผ เดเดจเตเดจเดพเดฏเดฟ เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเต:
WITH RECURSIVE T AS (
SELECT
0 i
...
UNION ALL
SELECT
i + 1
...
WHERE
T.i < 64 -- ะฟัะตะดะตะป
)
เดชเตเดฐเต: เดเดเตเดเตพ เดฒเตเดชเตเดชเต เดเตเดฏเตเดฏเดพเตป เดถเตเดฐเดฎเดฟเดเตเดเตเดฎเตเดชเตเตพ, "เดเดดเดคเตเดคเดฟเตฝ" เดเดตเตผเดคเตเดคเดจเดเตเดเดณเตเดเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเด เดชเดฐเดฟเดงเดฟเดฏเดฟเตฝ เดเตเดเตเดคเตฝ เดเดเตเดเตพ เดเตเดฏเตเดฏเดฟเดฒเตเดฒ.
เดฌเดพเดเตเดเตเดเตเดฐเตเดฏเดฟเดธเตเดเตเดพเดฃเตเดเตเต: เดเดเตเดเตพ เด
เดคเต เดฑเตเดเตเดเตเตผเดกเต เดตเตเดฃเตเดเตเด เดชเตเดฐเตเดธเดธเตเดธเต เดเตเดฏเตเดฏเดฟเดฒเตเดฒ เดเดจเตเดจเดคเดฟเดจเต เดฏเดพเดคเตเดฐเต เดเดฑเดชเตเดชเตเดฎเดฟเดฒเตเดฒ - เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, 15, 25 เดเดดเดคเตเดคเดฟเตฝ, เดคเตเดเตผเดจเตเดจเต เดเดฐเต +10 เดฒเตเด. "เดตเดฟเดถเดพเดฒเดค"เดฏเตเดเตเดเตเดฑเดฟเดเตเดเต เดเดฐเตเด เดเดจเตเดจเตเด เดตเดพเดเตเดฆเดพเดจเด เดเตเดฏเตเดคเดฟเดฒเตเดฒ.
เดเดชเดเดพเดฐเดฟเดเดฎเดพเดฏเดฟ, เด เดคเตเดคเดฐเดฎเตเดฐเต เดเดตเตผเดคเตเดคเดจเด เด เดจเดจเตเดคเดฎเดพเดฏเดฟเดฐเดฟเดเตเดเดฟเดฒเตเดฒ, เดเดจเตเดจเดพเตฝ เดเดฐเต เดเดเตเดเดคเตเดคเดฟเดฒเตเด เดฑเตเดเตเดเตเตผเดกเตเดเดณเตเดเต เดเดฃเตเดฃเด เดเตเดฐเดฎเดพเดคเตเดคเดฎเดพเดฏเดฟ เดตเตผเดฆเตเดงเดฟเดเตเดเตเดเดฏเดพเดฃเตเดเตเดเดฟเตฝ, เด เดคเต เดเดเตเดเดจเต เด เดตเดธเดพเดจเดฟเดเตเดเตเดฎเตเดจเตเดจเต เดจเดฎเตเดเตเดเตเดฒเตเดฒเดพเดตเตผเดเตเดเตเด เดจเดจเตเดจเดพเดฏเดฟ เด เดฑเดฟเดฏเดพเด...
"เดชเดพเดค"เดฏเตเดเต เดเดพเดตเตฝเดเตเดเดพเดฐเตป
เดเดตเตผเดคเตเดคเดจ เดชเดพเดคเดฏเดฟเตฝ เดเดเตเดเตพ เดจเตเดฐเดฟเดเตเด เดเดฒเตเดฒเดพ เดเดฌเตโเดเดเตโเดฑเตเดฑเต เดเดกเดจเตเดฑเดฟเดซเดฏเดฑเตเดเดณเตเด เดเดฐเต เด เดฑเตเดฏเดฟเดฒเตเดเตเดเต เดเดจเตเดจเดฟเดเดตเดฟเดเตเดเต เดเตเตผเดเตเดเตเดจเตเดจเต, เด เดคเตเดฐเต เดธเดตเดฟเดถเตเดทเดฎเดพเดฏ "เดชเดพเดคเตเดคเต" เดเดฃเต:
WITH RECURSIVE T AS (
SELECT
ARRAY[id] path
...
UNION ALL
SELECT
path || id
...
WHERE
id <> ALL(T.path) -- ะฝะต ัะพะฒะฟะฐะดะฐะตั ะฝะธ ั ะพะดะฝะธะผ ะธะท
)
เดชเตเดฐเต: เดกเดพเดฑเตเดฑเดฏเดฟเตฝ เดเดฐเต เดธเตเดเตเดเดฟเตพ เดเดฃเตเดเตเดเตเดเดฟเตฝ, เดเดฐเต เดชเดพเดคเดฏเดฟเตฝ เดเดเตเดเตพ เดเดฐเต เดฑเตเดเตเดเตเตผเดกเต เดเดตเตผเดคเตเดคเดฟเดเตเดเต เดชเตเดฐเตเดธเดธเตเดธเต เดเตเดฏเตเดฏเดฟเดฒเตเดฒ.
เดฌเดพเดเตเดเตเดเตเดฐเตเดฏเดฟเดธเตเดเตเดพเดฃเตเดเตเต: เดเดจเตเดจเดพเตฝ เด
เดคเต เดธเดฎเดฏเด, เดจเดฎเตเดเตเดเต เดธเตเดตเดฏเด เดเดตเตผเดคเตเดคเดฟเดเตเดเดพเดคเต เดเดฒเตเดฒเดพ เดฑเตเดเตเดเตเตผเดกเตเดเดณเตเด เด
เดเตเดทเดฐเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดฎเดฑเดฟเดเดเดเตเดเดพเตป เดเดดเดฟเดฏเตเด.
เดชเดพเดค เดฆเตเตผเดเตเดฏ เดชเดฐเดฟเดงเดฟ
เดฎเดจเดธเตเดธเดฟเดฒเดพเดเตเดเดพเตป เดเดดเดฟเดฏเดพเดคเตเดค เดเดดเดคเตเดคเดฟเตฝ "เด เดฒเดเตเดเตเดชเตเดเตเดจเตเดจ" เดเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเตเดฑเต เดธเดพเดนเดเดฐเตเดฏเด เดเดดเดฟเดตเดพเดเตเดเดพเตป, เดจเดฎเตเดเตเดเต เดฎเตเดฎเตเดชเดคเตเดคเต เดฐเดฃเตเดเต เดฐเตเดคเดฟเดเตพ เดธเดเดฏเตเดเดฟเดชเตเดชเดฟเดเตเดเดพเด. เด เดฒเตเดฒเตเดเตเดเดฟเตฝ, เด เดจเดพเดตเดถเตเดฏเดฎเดพเดฏ เดซเตเตฝเดกเตเดเตพ เดชเดฟเดจเตเดคเตเดฃเดฏเตเดเตเดเดพเตป เดเดเตเดเตพ เดเดเตเดฐเดนเดฟเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒเตเดเตเดเดฟเตฝ, เดชเดพเดคเดฏเตเดเต เดฆเตเตผเดเตเดฏเดคเตเดคเดฟเดจเตเดฑเต เดเดฐเต เดเดธเตเดฑเตเดฑเดฟเดฎเตเดฑเตเดฑเต เดเดชเดฏเตเดเดฟเดเตเดเต เดเดตเตผเดคเตเดคเดจเด เดคเตเดเดฐเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดตเตเดฏเดตเดธเตเดฅเดฏเตเดเตเดเต เด เดจเตเดฌเดจเตเดงเดฎเดพเดฏเดฟ เดจเตฝเดเตเด:
WITH RECURSIVE T AS (
SELECT
ARRAY[id] path
...
UNION ALL
SELECT
path || id
...
WHERE
id <> ALL(T.path) AND
array_length(T.path, 1) < 10
)
เดจเดฟเดเตเดเดณเตเดเต เด
เดญเดฟเดฐเตเดเดฟเดเตเดเดจเตเดธเดฐเดฟเดเตเดเต เดเดฐเต เดฐเตเดคเดฟ เดคเดฟเดฐเดเตเดเตเดเตเดเตเดเตเด!
เด
เดตเดฒเดเดฌเด: www.habr.com