CREATE TABLE a ( id INTEGER PRIMARY KEY NOT NULL ): CREATE TABLE b ( id INTEGER PRIMARY KEY NOT NULL, a INT NOT NULL, FOREIGN KEY (a) REFERENCES a(id) ON DELETE CASCADE ON UPDATE CASCADE ): CREATE INDEX b_idx_a ON b (a): CREATE TABLE c ( b INT NOT NULL, x INT NOT NULL, PRIMARY KEY (b, x), FOREIGN KEY (b) REFERENCES b(id) ON DELETE CASCADE ON UPDATE CASCADE ): CREATE INDEX c_idx_b ON c (b): INSERT INTO a DEFAULT VALUES: INSERT INTO b ( a) VALUES ( ? ): '1' INSERT INTO c ( b, x) VALUES ( ?, ? ): '1', '1001' INSERT INTO c ( b, x) VALUES ( ?, ? ): '1', '1002' INSERT INTO c ( b, x) VALUES ( ?, ? ): '1', '1003' SELECT COUNT( * ) FROM b me JOIN c c ON c.b = me.id WHERE ( me.a = ? ): '1' SELECT c.x FROM b me JOIN c c ON c.b = me.id WHERE ( me.a = ? ): '1' BEGIN WORK SELECT c.b, c.x FROM b me JOIN c c ON c.b = me.id WHERE ( me.a = ? ) GROUP BY c.b, c.x: '1' DELETE FROM c WHERE ( ( ( b = ? AND x = ? ) OR ( b = ? AND x = ? ) OR ( b = ? AND x = ? ) ) ): '1', '1001', '1', '1002', '1', '1003' COMMIT DELETE FROM c WHERE ( b = ? ): '1'