SELECT g.parentId, d.id, d.name, d.isMain
FROM (SELECT DISTINCT parentId
FROM my_table) g,
JOIN my_table d
ON d.id == (
SELECT o.id
FROM my_table o
WHERE o.parentId == g.parentId
ORDER BY o.isMain DESC)
Нужен индекс по
parentId
, но он у вас, наверное, есть. И вот это вот
== (SELECT ...)
— это, наверное, особенность SQLite, там такая конструкция возвращает единственное значение. В другом диалекте может потребоваться писать что-то вроде:
ON d.id IN (
SELECT o.id
FROM my_table o
WHERE o.parentId == g.parentId
ORDER BY o.isMain DESC
LIMIT 1)