CREATE TABLE persons ( id INTEGER NOT NULL PRIMARY KEY, first_name TEXT NOT NULL, last_name TEXT NOT NULL ); CREATE TABLE instruments ( id INTEGER NOT NULL PRIMARY KEY, name TEXT NOT NULL ); CREATE TABLE works ( id INTEGER NOT NULL PRIMARY KEY, composer INTEGER REFERENCES persons(id), title TEXT NOT NULL, part_of INTEGER REFERENCES works(id) ON DELETE CASCADE, part_index INTEGER, part_level INTEGER ); CREATE TABLE instrumentations ( work INTEGER NOT NULL REFERENCES works(id) ON DELETE CASCADE, instrument INTEGER NOT NULL REFERENCES instruments(id) ON DELETE CASCADE ); allPersons: SELECT * FROM persons ORDER BY last_name; personById: SELECT * FROM persons WHERE id = :id LIMIT 1; allInstruments: SELECT * FROM instruments ORDER BY name; instrumentById: SELECT * FROM instruments WHERE id = :id LIMIT 1; workById: SELECT * FROM works WHERE id = :id LIMIT 1; workParts: SELECT * FROM works WHERE part_of = :id ORDER BY part_index; -- TODO: Uncomment this once https://github.com/simolus3/moor/issues/453 is fixed. -- worksByComposer(:id AS INTEGER): -- SELECT DISTINCT A.* FROM works A, works B ON A.id = B.part_of -- WHERE A.composer = :id OR B.composer = :id; instrumentsByWork: SELECT instruments.* FROM instrumentations JOIN instruments ON instrumentations.instrument=instruments.id WHERE instrumentations.work = :workId;