notesmachine/server/nm-store/experiments/demo_select_tree.sql

89 lines
2.4 KiB
SQL

DROP TABLE IF EXISTS notes;
DROP TABLE IF EXISTS note_relationships;
DROP TABLE IF EXISTS pages;
DROP TABLE IF EXISTS page_relationships;
DROP TABLE IF EXISTS favorites;
CREATE TABLE notes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
uuid TEXT NOT NULL UNIQUE,
notetype TEXT
);
CREATE TABLE pages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
slug text NOT NULL UNIQUE,
note_id INTEGER,
FOREIGN KEY (note_id) REFERENCES notes (id) ON DELETE NO ACTION ON UPDATE NO ACTION
);
CREATE TABLE note_relationships (
note_id INTEGER NOT NULL,
parent_id INTEGER NOT NULL,
position INTEGER NOT NULL,
nature TEXT NOT NULL,
FOREIGN KEY (note_id) REFERENCES notes (id) ON DELETE NO ACTION ON UPDATE NO ACTION,
FOREIGN KEY (parent_id) REFERENCES notes (id) ON DELETE NO ACTION ON UPDATE NO ACTION
);
CREATE TABLE page_relationships (
note_id INTEGER NOT NULL,
page_id INTEGER NOT NULL,
FOREIGN KEY (note_id) references notes (id) ON DELETE NO ACTION ON UPDATE NO ACTION,
FOREIGN KEY (page_id) references pages (id) ON DELETE NO ACTION ON UPDATE NO ACTION
);
INSERT INTO notes (id, uuid, notetype) VALUES
(1, "U1", "root"),
(2, "U2", "note"),
(3, "U3", "note"),
(4, "U4", "note"),
(5, "U5", "note"),
(6, "U6", "note"),
(7, "U7", "note"),
(8, "U8", "note");
INSERT INTO note_relationships (note_id, parent_id, position, nature) VALUES
(2, 1, 1, "note"),
(3, 1, 2, "note"),
(4, 3, 1, "note"),
(5, 3, 2, "note"),
(6, 5, 1, "note"),
(7, 4, 1, "note"),
(8, 7, 1, "note");
SELECT id, uuid, parent_id, parent_uuid, position, notetype
FROM (
WITH RECURSIVE notetree (
id, uuid, parent_id, parent_uuid, position, notetype, cycle
)
AS (
SELECT notes.id, notes.uuid,
notes.id AS parent_id,
notes.uuid AS parent_uuid,
0, notes.notetype, ','||notes.id||','
FROM notes
WHERE notes.id = 1 AND notes.notetype = "root"
UNION
SELECT notes.id, notes.uuid,
notetree.id AS parent_id,
notetree.uuid AS parent_uuid,
note_relationships.position,
notes.notetype,
notetree.cycle||notes.id||','
FROM notes
INNER JOIN note_relationships
ON notes.id = note_relationships.note_id
INNER JOIN notetree
ON note_relationships.parent_id = notetree.id
WHERE notetree.cycle NOT LIKE '%,'||notes.id||',%'
ORDER BY note_relationships.position
)
SELECT * from notetree);