【发布时间】:2012-01-11 17:08:10
【问题描述】:
我正在尝试编写一个从包含数据的表中返回行的 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;
【问题讨论】:
-
订单重要吗?如果您有
INSERT, INSERT, DELETE,应该保留哪个插入? -
@Martin - 最新的 INSERT 行最相关,所以我猜是第二行。
标签: sql postgresql postgresql-9.1