Я пытаюсь написать запрос SQL, который возвращает строки из таблицы, содержащей данные:
Структура таблицы следующая:
CREATE TABLE person(
id INT PRIMARY KEY,
name TEXT,
operation TEXT);
Я хочу вернуть все уникальные строки имени, которые не были "отменены".
Строка считается «отмененной», если операция «вставить» или «удалить», и существует другая строка с тем же именем и противоположной операцией.
Например, если у меня есть следующие строки
id name operation
1 bob insert
2 bob delete
3 bob insert
Первые 2 строки «отменяют» друг друга, потому что они имеют одно и то же имя с противоположными операциями. Таким образом, запрос должен вернуть строку 3.
Вот еще один пример:
id name operation
1 bob insert
2 bob delete
3 bob insert
4 bob delete
В этом случае строки 1 и 2 удаляются, а строки 3 и 4 удаляются. Таким образом, запрос не должен возвращать никаких строк.
Последний пример:
id name operation
1 bob insert
2 bob insert
В этом случае строки 1 и 2 не отменяются, поскольку операции не противоположны. Таким образом, запрос должен возвращать обе строки.
У меня есть следующий запрос, который обрабатывает первые два сценария, но он не обрабатывает окончательный сценарий.
Есть ли у кого-нибудь предложения по запросу, который может обрабатывать все 3 сценария?
SELECT MAX(id),name
FROM person z
WHERE operation IN ('insert','delete')
GROUP BY name
HAVING count(1) % 2 = 1;