sql-只匹配in子句中的值(不能少或多)

agxfikkp  于 2021-07-24  发布在  Java
关注(0)|答案(4)|浏览(350)

我有以下许多表team\u用户,数据如下:

TEAM_ID     USER_ID
1           10
1           3
1           4
1           11
12          10
12          3
12          4
11          3
11          4
18          10
18          7
18          4
18          11

所以,我想得到只有两个用户在(3,4)中有用户id的team\u id,在本例中是team 11。但是我得到了1队,11队和12队。我只想要11队。
我做了以下代码,但我没有得到预期的结果

SELECT  team_id
FROM    team_users 
WHERE   user_profile_id IN (3 , 4)
GROUP   BY team_id
HAVING  COUNT(DISTINCT user_profile_id) = 2;

此查询的结果是:

TEAM_ID
1
11
12

所以,如果你能帮上忙,我将不胜感激。
================编辑:列表是唯一的,没有重复项

66bbxpm5

66bbxpm51#

将where条件移到条件聚合中。
只要team\u id/user\u profile\u id的组合是唯一的:

select team_id
from team_users 
group by team_id
-- exactly those two and no other
having sum(case when user_profile_id in (3, 4) then 1 else -1 end) = 2
hc8w905p

hc8w905p2#

你的 where 子句筛选出 user_profile_id 不是 3 或者 4 在你有机会考虑他们之前。你可以把逻辑移到 having 子句,例如:

select team_id
from team_users 
group by team_id
having  
    sum(case when user_profile_id in (3, 4) then 1 else 0 end) = 2
    and sum(case when user_profile not in (3, 4) then 1 else 0 end) = 0

这是假设 (team_id, user_profile_id) 元组在数据中是唯一的,如示例数据所示。

ymzxtsji

ymzxtsji3#

将所有筛选移到 where 条款:

SELECT team_id
FROM team_users 
GROUP BY team_id
HAVING COUNT(*) = 2 AND
       SUM(CASE WHEN user_profile_id IN (3 , 4) THEN 1 ELSE 0 END) = 2;

这将检查是否有两个成员,并且它们是两个指定的成员。此外,这假设没有重复,这似乎是合理的。
你也可以用 LISTAGG() 假设列表不太大:

SELECT team_id
FROM team_users 
GROUP BY team_id
HAVING LISTAGG(user_profile_id, ',') WITHIN GROUP (ORDER BY user_profile_id) = '3,4';
lskq00tm

lskq00tm4#

您可以为where子句提供和条件,以便只获取结果 team_id = 11 ```
SELECT team_id
FROM team_users
WHERE user_profile_id IN (3 , 4) AND team_id = 11
GROUP BY team_id
HAVING COUNT(DISTINCT user_profile_id) = 2;

我没有类似的测试数据库设置,所以你可能想运行并检查它

相关问题