我正在尝试编写一个 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;