有对 (type_id, element_id),例如 (1,1), (1,2), .. (5,3)。如果我需要获取没有 element_id 1 的类型 ID,如何从结果中排除 type_id?

There are pairs (type_id, element_id), like (1,1), (1,2), .. (5,3). How to exclude type_id from result if I need to get type ids without element_id 1?

我有下一个tablex:

id | type_id | element_id
-------------------------
1  |    1    |     1 
2  |    1    |     2
3  |    1    |     3
4  |    2    |     1
5  |    3    |     1
6  |    4    |     2
7  |    5    |     3

我需要获取所有满足条件 element_id != 1 的类型 ID,换句话说如何获取下一个 type_ids: [4, 5]?

如果我简单地做 SELECT type_id FROM x WHERE element_id != 1,我会收到 [1, 1, 4, 5]。

您可以尝试使用 HAVING 中的条件聚合函数,其中不包含 type_id

中的任何 element_id = 1
SELECT type_id 
FROM x
GROUP BY type_id 
HAVING COUNT(CASE WHEN element_id = 1 THEN 1 END) = 0 

sqlfiddle

或者使用带聚合函数的过滤子句

SELECT type_id 
FROM x
GROUP BY type_id 
HAVING COUNT(*) FILTER (WHERE element_id = 1 ) = 0