首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -筛选出至少有一个成员不属于特定结果的完整组。

SQL -筛选出至少有一个成员不属于特定结果的完整组。
EN

Stack Overflow用户
提问于 2018-10-17 14:24:04
回答 1查看 31关注 0票数 1

我有两个SQL表:

表-1 (Group_Departments)

代码语言:javascript
复制
   Group--------- | ---------Department_ID
    G1 ---------- | ------------- 1
    G1 ---------- | ------------- 43
    G1 ---------- | ------------- 6
    G2 ---------- | ------------- 43
    G2 ---------- | ------------- 46
    G3 ---------- | ------------- 1
    G3 ---------- | ------------- 1
    G4 ---------- | ------------- 46
    G4 ---------- | ------------- 43
    G4 ---------- | ------------- 1
    G4 ---------- | ------------- 32

表-2 (Allowed_Departments)

代码语言:javascript
复制
Department_ID
1
46
43

目标结果逻辑:

  1. G1 -不应该出现,因为它有一个部门'36‘,这不是允许的部门名单的一部分。
  2. G2 -应该是结果的一部分,因为两个部门'43和46‘都是允许的部门的一部分。
  3. G3 -应该出现,因为'1‘是允许的部门的一部分。
  4. G4 -不应该出现。虽然其中三个部门是被允许部门的一部分,但其中一个部门'32‘不是被允许部门的一部分。

查询的结果应该是:

结果

代码语言:javascript
复制
G2
G3
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-17 14:28:46

您可以使用HAVING和条件聚合:

代码语言:javascript
复制
SELECT [Group]
FROM Group_Departments gd
LEFT JOIN Allowed_Departments ad
  ON gd.department_id = ad.department_id
GROUP BY [Group]
HAVING SUM(CASE WHEN ad.department_id IS NULL THEN 1 ELSE 0 END) = 0;

db<>fiddle demo

或者,正如@Gordon Linoff建议的那样:

代码语言:javascript
复制
SELECT [Group]
FROM Group_Departments gd
LEFT JOIN Allowed_Departments ad
  ON gd.department_id = ad.department_id
GROUP BY [Group]
HAVING COUNT(ad.department_id) = COUNT(*)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52857241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档