我只想选择那些在特定组中的ID。 例如:
ID GroupID
1 11
1 12
2 11
2 12
2 13
在这里,我想选择组 11 和 12 中的 ID,但不在其他组中。 因此,结果应仅显示 ID 1 而不是 2。 有人可以为此提供 SQL 吗? 我试过了
SELECT ID FROM table
WHERE GroupID = 11 AND GroupID = 12 AND GroupID != 13;
但这没有用。
您可以使用聚合:
select id
from mytable
group by id
having min(groupID) = 11 and max(groupID) = 12
此having
条件可确保给定的 id 属于groupID
s 11和12,而不是属于其他组。这是有效的,因为 11 和 12 是连续数字。
其他选项:如果您希望id
属于组 11 或 12(不一定同时属于组(,并且不属于其他组,则:
having sum(case when groupId in (11, 12) then 1 end) = count(*)
如果数字不是连续的,并且您希望在两个组中(必须(中都id
s,而不是在其他组中:
having
max(case when groupID = 11 then 1 end) = 1
and max(case when groupID = 12 then 1 end) = 1
and max(case when groupID in (11, 12) then 0 else 1 end) = 0
SELECT t.id FROM table t
where exists(
SELECT * FROM table
where group = 11
and t.id = id
)
and exists(
SELECT * FROM table
where group = 12
and t.id = id
)
and not exists(
SELECT * FROM table
where group = 13
and t.id = id
)
group by t.id
一种方法是条件聚合:
select id
from t
group by id
having sum(case when groupid = 1 then 1 else 0 end) > 0 and
sum(case when groupid = 2 then 1 else 0 end) > 0 and
sum(case when groupid in (1, 2) then 1 else 0 end) = 0 ;
您可以将GROUP BY
与HAVING
和条件COUNT
一起使用:
SELECT id
FROM table_name
GROUP BY ID
HAVING COUNT( CASE Group_ID WHEN 11 THEN 1 END ) > 0
AND COUNT( CASE Group_ID WHEN 12 THEN 1 END ) > 0
AND COUNT( CASE WHEN Group_ID NOT IN ( 11, 12 ) THEN 1 END ) = 0
或者,您可以使用集合:
CREATE TYPE int_list IS TABLE OF NUMBER(8,0);
和:
SELECT id
FROM table_name
GROUP BY id
HAVING int_list( 11, 12 ) SUBMULTISET OF CAST( COLLECT( group_id ) AS int_list )
AND CARDINALITY( CAST( COLLECT( group_id ) AS int_list )
MULTISET EXCEPT int_list( 11, 12 ) ) = 0
(使用集合的优点是可以将所需值的集合作为单个绑定参数传递,而如果要将可变数量的项传递给查询,则使用条件聚合可能需要动态 SQL。
两个输出:
|身份证 | |-: | | 1 |
db<>小提琴在这里
使用连接:
SELECT DISTINCT c11.ID
FROM (SELECT ID FROM WORK_TABLE WHERE GROUPID = 11) c11
INNER JOIN (SELECT ID FROM WORK_TABLE WHERE GROUPID = 12) c12
ON c12.ID = c11.ID
LEFT OUTER JOIN (SELECT ID FROM WORK_TABLE WHERE GROUPID NOT IN (11, 12)) co
ON co.ID = c11.ID
WHERE co.ID IS NULL;
前两个子查询之间的INNER JOIN
可确保 GROUPID 11 和 12 都存在行,并且LEFT OUTER JOIN
和WHERE
验证任何其他 GROUPID 没有行。
在这里小提琴