Айтишники, как в sql эффективно в один запрос выбирать n последних детей для указанных родителей без саб-кверей и диалектоспецифичных штук типа ROW_NUMBER(), чтобы везде mysql, sqlite, postgres работало одинаково?
sqlite:
CREATE TABLE parent (id integer primary key autoincrement, value varchar not null);
INSERT INTO parent VALUES(1,'first parent');
INSERT INTO parent VALUES(2,'second parent');
INSERT INTO parent VALUES(3,'third parent');
CREATE TABLE child (id integer primary key autoincrement, parent_id integer references parent(id) on delete cascade, value varchar not null);
INSERT INTO child VALUES(1,1,'p1 c1');
INSERT INTO child VALUES(2,1,'p1 c2');
INSERT INTO child VALUES(3,1,'p1 c3');
INSERT INTO child VALUES(4,2,'p2 c1');
INSERT INTO child VALUES(5,2,'p2 c2');
INSERT INTO child VALUES(6,2,'p2 c3');
INSERT INTO child VALUES(7,3,'p3 c1');
INSERT INTO child VALUES(8,3,'p3 c2');
INSERT INTO child VALUES(9,3,'p3 c3');
Допустим, надо получить по два последних чайлда родителей 2 и 3 (т.е. 5, 6, 8, 9). Вот так выбирает то что нужно:
SELECT child.id, child.value FROM child LEFT JOIN child child2 ON child.parent_id = child2.parent_id AND child.id >= child2.id WHERE child.parent_id IN ( 2, 3 ) GROUP BY child2.id HAVING count(*) <= 2 ORDER BY child.parent_id DESC, child.id DESC;
Работать работает, но на больших таблицах на десятки тысяч строк оно захлебнётся ебейшими жойнами. Есть варианты лучше, отвечающие вышеперечисленным критериям?