Oracle SQL:如何只选择特定组中的成员ID?



我只想选择那些在特定组中的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 属于groupIDs 1112,而不是属于其他组。这是有效的,因为 11 和 12 是连续数字。

其他选项:如果您希望id属于组 11 或 12(不一定同时属于组(,并且不属于其他组,则:

having sum(case when groupId in (11, 12) then 1 end) = count(*)

如果数字不是连续的,并且您希望在两个组中(必须(中都ids,而不是在其他组中:

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 BYHAVING和条件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 JOINWHERE验证任何其他 GROUPID 没有行。

在这里小提琴

最新更新