DBMS αααα»αααααααααααΎααΆαααΎαααααΆαααααΌα
ααααΆ - "ααβααααΆααβαααα»αβα²ααβααΈα ααΌα
ααααβαααα»αβααΈα"α ααααΎααααα’ααααα·αααααΉαααα’αΆα
αααααααααΎαααΆαααααα
αα·αααΆαααααα αααααα½αααααααΆααααα processor α₯αααααα ααα»αααααααααΆαα "αααααΆαα" ααΌαααααΆααα·ααααααααΆααααΌα "αααΆα" α’αααα
αα
αΆααααααΆαααΆααα’ααα ααΆαααΆαααΆααααααΆααααΉαααΆαααΎαα‘αΎααα·αααααΆαααααα - αααα½ααα»αααααΌαααααα’αααα’αα·αααααααααα½αα―αα
αα
αααα»α 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;
ααααΎαααααΈ 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;
ααα»αααααααααΆαααΎααααααααααΌαααΆααααααΆαααααΆααααΌαααΈααΆαααΆ root ααΌα ααααα ααα»α’αααΈααΆαααΆααΎααα·αααααΎ ααααααααααααααΆααααααααΆαα ααΆαα»ααΈαα½αα ααααααααααααα·?
-- Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠΎΠ»Π΅ Ρ ΠΎΠ±ΡΠΈΠΌ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠΌ ΡΠ΅ΠΌΡ ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡ Π½Π° Π½Π΅Π³ΠΎ
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