Понятно.
1. Погуглить построение дерева через JOIN (если число уровней ограниченное)
2. В SQLLite есть CTE - рекурсия => стандартное решение построения дерева.
Строите в запросе дерево с нужного узла, выбирая их ИД и далее исключаете их.
WHETE id NOT IN
(
SELECT t2.id
FROM categories AS t1
LEFT JOIN categories AS t2 ON t2.parent_id = t1.id
WHERE t1.id = 1 ---- тут ваша категория переносимая
UNION
SELECT t3.id
FROM categories AS t1
LEFT JOIN categories AS t2 ON t2.parent_id = t1.id
LEFT JOIN categories AS t3 ON t3.parent_id = t2.id
WHERE t1.id = 1 ---- тут ваша категория переносимая
)
с рекурсией интересней:
WITH RECURSIVE CTE as (
select Id, Name, parent_id, 0 as Level
from categories
where parent_id = @IdCategory ---- тут ваша категория переносимая
union all
select
t2.Id, t2.Name, t2.parent_id, Level + 1
from categories t2
join CTE on CTE.Id = t2.parent_id
)
SELECT * FROM categories
WHERE Id NOT IN (SELECT Id FROM CTE )
за синтаксис не отвечаю, нет возможности проверить)