Скажем, у меня есть таблица проекта: каждый родитель имеет уникальный идентификатор, а родительский столбец установлен в null.
проект:
id | parent_id | is_deleted
--- ------------ ------------
1 | null | 0
2 | 1 | 0
3 | 1 | 1
4 | null | 0
5 | 4 | 1
6 | 4 | 1
7 | 4 | 0
8 | null | 0
9 | 8 | 1
Теперь я хочу получить список родителей, у которых есть все их удаленные только.
select id
from draft
where id in (
select parent_id
from draft
where id in (1, 2, 3, 5, 7, 9)
group by parent_id
having sum(case when is_deleted 0 then 1 else 0) <= 0
)
where is_deleted = 0;
Проблема здесь в том, что он всегда возвращает родительский 1, 4 и 8. Но он должен возвращать только 8.
UPDATE: Я хочу родительскую строку, а не родительский идентификатор.
Это должно работать:
select * from draft
where id in
(
select parent_id from draft a where is_deleted = 1
and not exists
(select 1 from draft b where a.parent_id = b.parent_id and is_deleted = 0)
)
Вы можете также использовать JOIN
вместо IN
select draft.* from draft
join(
select parent_id from draft a where is_deleted = 1
and not exists
(select 1 from draft b where a.parent_id = b.parent_id and is_deleted = 0)
) p on parent.id = p.parent_id
Как насчет
select a.*
from draft a
join
(select distinct parent_id
from draft d
where (select count(*) from draft e
where e.is_deleted = 0 and e.parent_id = d.parent_id) = 0) b
on a.id=b.parent_id
Я предположил, что вы хотите, чтобы parent_id возвращался, а не id, поскольку ваше описание подразумевает первое, а ваш фактический sql подразумевает последний.