DBMS แแ แแฎแ แแ แแฃแจแแแแก แแแแแ แแ แแแชแแแแแแ - "แแแแฎแ แแก, แแแแแฎแแ แแ, แแกแ แแแฎแ แแแฅแแแแก แแแแฎแแแแแก แจแแฃแซแแแ แแ แ แแฎแแแแ แจแแแแแแแก แแแแแแแแ แแ แแชแแกแแแ, แแฃแแแแแแ แแแแแแกแแก แแ แแชแแกแแ แแก แ แแกแฃแ แกแแแ, แแ แแแแ แแแแแ แแแแแชแแแแ แแแแแก โแฉแแแแแแโ แแ โแจแแญแแแแกโ แงแแแแ แฎแแแแแกแแฌแแแแแ แแแฎแกแแแ แแแ. แแแแขแแ. แแแชแแ แฃแกแแกแ แฃแแ แ แแแฃแ แกแแแกแแแ - แแแกแฃแฎแแกแแแแแแแแ แแแแแ แแแแแแแแแ แแ.
PostgreSQL-แจแ, แ แแแฃแ แกแแฃแแ แแแแฎแแแแแแแก แแแแแงแแแแแแก แจแแกแแซแแแแแแแ WITH RECURSIVE
แแ แแแฌแแ แแ แ แแแฃแ แกแแฃแแ แแแแฎแแแแแแ
แแ แฉแแฌแแ แแ แแ แแ แแแฃแ แกแแฃแแ. แแแขแแแแกแชแแแแ, แแฅแแแแ K.O.
แกแแแแแแแแแแจแ, 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;
แแแแแแงแแแแ gener_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 -- ะฟัะตะดะตะป
)
Pro: แ แแแแกแแช แฉแแแ แแชแแแแแแ แชแแแแแก แแแแแแแแแก, แฉแแแ แแแแแช แแแแแแแแแแ แแ แแฃแแแขแแก แแแแแแ แแแแแแก แแแแแแแแฃแ แแฆแแแ แก "แกแแฆแ แแแกแแฃแแแ".
Cons: แแ แแ แกแแแแแก แแแ แแแขแแ, แ แแ แฉแแแ แแฆแแ แแแแแแฃแจแแแแแ แแแแแ แฉแแแแฌแแ แก - แแแแแแแแแ, 15 แแ 25 แกแแฆแ แแแแ แแ แจแแแแแ แงแแแแ +10. แแ แแ แแแแ แแ แแคแแ แก แแแแแ แแ "แกแแแแแแแ".
แคแแ แแแแฃแ แแ, แแกแแแ แ แแแฃแ แกแแ แฃแกแแกแ แฃแแ แแ แแฅแแแแ, แแแแ แแ แแฃ แงแแแแ แกแแคแแฎแฃแ แแ แฉแแแแฌแแ แแแแก แ แแแแแแแแ แแฅแกแแแแแแขแฃแ แแ แแแ แแแแ, แงแแแแแ แแแ แแแ แแแชแแ, แ แแแแ แแแแแ แแแแ...
"แแแแก" แแชแแแแ
แฉแแแ แแแแแชแแแแแแแ แแแแแขแแแ แงแแแแ แแแแแฅแขแแก แแแแแขแแคแแแแขแแ แก, แ แแแแแแช แจแแแแฎแแแ แ แแแฃแ แกแแแก แแแแก แแแกแฌแแ แแ, แแแกแแแจแ, แ แแแแแแช แแ แแก แฃแแแแแแฃแ แ โแแแโ แแแกแแแ:
WITH RECURSIVE T AS (
SELECT
ARRAY[id] path
...
UNION ALL
SELECT
path || id
...
WHERE
id <> ALL(T.path) -- ะฝะต ัะพะฒะฟะฐะดะฐะตั ะฝะธ ั ะพะดะฝะธะผ ะธะท
)
Pro: แแฃ แแแแแชแแแแแจแ แแ แแก แชแแแแ, แฉแแแ แแแกแแแฃแขแฃแ แแ แแ แแแแแแฃแจแแแแแ แแแแแ แฉแแแแฌแแ แก แแแแแแแ แแแแ แแแแแ แแแแแ.
Cons: แแแแ แแ แแแแแ แแ แแก, แฉแแแ แจแแแแแซแแแ แกแแขแงแแแกแแขแงแแแ แแแฃแแ แแ แงแแแแ แฉแแแแฌแแ แก แกแแแฃแแแ แ แแแแแก แแแแแแ แแแแก แแแ แแจแ.
แแแแแแแก แกแแแ แซแแก แแแแแขแ
แแแฃแแแแแ แกแแฆแ แแแแ แ แแแฃแ แกแแฃแแ โแฎแแขแแแแแกโ แกแแขแฃแแชแแแก แแแแแแแ แแกแแชแแแแแแแ, แจแแแแแซแแแ แแแแแแ แแแแแแ แฌแแแ แแ แ แแแแแแ. แแ, แแฃ แแ แแแแแแ แแ แแกแแญแแ แ แแแแแแแก แแฎแแ แแแญแแ แ, แจแแแแกแแ แ แแแฃแ แกแแแก แแแแ แซแแแแแแก แแแ แแแ แแแแแแแก แกแแแ แซแแก แจแแคแแกแแแแ:
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