เจเจธ เจธเจฌเฉฐเจง เจตเจฟเฉฑเจ เจกเฉเจฌเฉเจเจฎเจเจธ เจเจธเฉ เจธเจฟเจงเจพเจเจคเจพเจ 'เจคเฉ เจเฉฐเจฎ เจเจฐเจฆเจพ เจนเฉ - "เจเจจเฉเจนเจพเจ เจจเฉ เจฎเฉเจจเฉเฉฐ เจเฉเจฆเจฃ เจฒเจ เจเจฟเจนเจพ, เจเจธ เจฒเจ เจฎเฉเจ เจเฉเจฆเจพเจ เจเฉเจคเฉ". เจคเฉเจนเจพเจกเฉ เจฌเฉเจจเจคเฉ เจจเจพ เจธเจฟเจฐเจซเจผ เจเฉเจเจเจขเฉ เจชเฉเจฐเจเจฟเจฐเจฟเจเจตเจพเจ เจจเฉเฉฐ เจนเฉเจฒเฉ เจเจฐ เจธเจเจฆเฉ เจนเฉ, เจฒเจเจพเจคเจพเจฐ เจชเฉเจฐเฉเจธเฉเจธเจฐ เจธเจฐเฉเจคเจพเจ เจจเฉเฉฐ เจฒเฉ เจเฉ, เจธเจเฉเจ เจชเฉเจฐเฉ เจกเฉเจเจพเจฌเฉเจธ เจจเฉเฉฐ "เจกเจฐเจพเจช" เจเจฐ เจธเจเจฆเฉ เจนเฉ, เจธเจพเจฐเฉ เจเจชเจฒเจฌเจง เจฎเฉเจฎเฉเจฐเฉ เจจเฉเฉฐ "เจเจพ" เจธเจเจฆเฉ เจนเฉเฅค เจเจธ เจฒเจ เจ
เจจเฉฐเจค เจฆเฉเจนเจฐเจพเจ เจฆเฉ เจตเจฟเจฐเฉเฉฑเจง เจธเฉเจฐเฉฑเจเจฟเจ - เจกเจฟเจตเฉเจฒเจชเจฐ เจฆเฉ เจเจผเจฟเฉฐเจฎเฉเจตเจพเจฐเฉ เจเฉเจฆเฅค
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;
เจฒเฉเจชเจธ เจฆเฉ เจฌเจเจพเจ generate_series เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเฉ
เจฎเฉฐเจจ เจฒเจ เจเจฟ เจธเจพเจจเฉเฉฐ เจเฉฑเจ เจธเจเฉเจฐเจฟเฉฐเจ เจฒเจ เจธเจพเจฐเฉ เจธเฉฐเจญเจต เจชเฉเจฐเฉเจซเจฟเจเจธ เจฌเจฃเจพเจเจฃ เจฆเฉ เจเฉฐเจฎ เจฆเจพ เจธเจพเจนเจฎเจฃเจพ เจเจฐเจจเจพ เจชเฉ เจฐเจฟเจนเจพ เจนเฉ '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;
เจชเจฐ เจเจฟเจเจเจเจฟ เจธเจพเจจเฉเฉฐ เจนเจฎเฉเจธเจผเจพ เจฐเฉเจ เจธเฉฐเจฆเฉเจธเจผ เจคเฉเจ เจชเฉเจฐเฉ เจตเจฟเจธเจผเฉ เจฆเฉ เจฒเฉเฉ เจนเฉเฉฐเจฆเฉ เจนเฉ, เจซเจฟเจฐ เจ เจธเฉเจ เจเจฟเจเจ เจจเจนเฉเจ เจเจฐเจฆเฉ เจนเจฐ เจเฉฐเจฆเจฐเจพเจเจผ เจตเจฟเฉฑเจ เจเจธเจฆเฉ ID เจธเจผเจพเจฎเจฒ เจเจฐเฉ เจเจเฉเจฎเฉเจเจฟเจ?
-- ะดะพะฑะฐะฒะธะผ ะฟะพะปะต ั ะพะฑัะธะผ ะธะดะตะฝัะธัะธะบะฐัะพัะพะผ ัะตะผั ะธ ะธะฝะดะตะบั ะฝะฐ ะฝะตะณะพ
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