Удалить записи, существующие в единственном числе

CREATE TABLE test(
 item_id INTEGER NOT NULL,
 parent_id INTEGER NOT NULL
);

INSERT INTO test(item_id, parent_id) VALUES
(1, 1),
(2, 1),
(2, 2),
(3, 2);

Необходимо выбрать все item_id, для которых parent_id = <значение> и которые не существуют c другими значениями parent_id. (в примере это item_id = 3 для parent_id = 2 и item_id = 1 для parent_id = 1)

SELECT s.item_id from test s WHERE s.parent_id = 2 AND NOT EXISTS (SELECT 1 FROM test t WHERE t.parent_id <> 2 AND t.item_id = s.item_id);

запрос в лоб выглядит крайне неоптимальным) По логике вещей при группировке по item_id надо выбрать всё, у кого parent_id = <значение> и COUNT = 1, но как написать хз)


Ответы (1 шт):

Автор решения: Akina

выбрать все item_id, для которых parent_id = <значение> и которые не существуют c другими значениями parent_id

SELECT item_id
FROM `table`
GROUP BY item_id
HAVING MIN(parent_id) = MAX(parent_id)

Выберутся item_id с единственным (даже если таких записей несколько несколько) одним и тем же parent_id, если он не NULL. Если нужны и NULL - заменить равенство на null-safe compare <=>.

Наличие индекса (item_id, parent_id) весьма желательно.

PS. Альтернативные варианты - с коррелированным подзапросом и с 2 копиями,- вряд ли будут производительнее...

→ Ссылка