下表中有两个字段,即a和b,如下所示:

create table employe
(
    empID varchar(10),
    department varchar(10)
);

插入一些记录:

insert into employe values('A101','Z'),('A101','X'),('A101','Y'),('A102','Z'),('A102','X'),
             ('A103','Z'),('A103','Y'),('A104','X'),('A104','Y'),('A105','Z'),('A106','X');


select * from employe;
empID   department
------------------
A101    Z
A101    X
A101    Y
A102    Z
A102    X
A103    Z
A103    Y
A104    X
A104    Y
A105    Z
A106    X

Note:现在我想展示一位员工,他只属于ZY部门.

Expected Result:

如果条件为:ZY,则结果应为:

empID
------
A103

如果条件为:ZX,则结果应为:

empID
------
A102

如果条件为:ZXY,则结果应为:

empID
------
A101

104: I want to do it in the 100 clause only (don't want to use the 101 and 102 clauses), because I'm going to include this one in the other 100 also.

推荐答案

这是一个Relational Division with no Remainder (RDNR)问题.请看德温营地的article篇文章,它为此类问题提供了许多解决方案.

First Solution

SQL Fiddle

SELECT empId
FROM (
    SELECT
        empID, cc = COUNT(DISTINCT department)
    FROM employe
    WHERE department IN('Y', 'Z')
    GROUP BY empID
)t
WHERE
    t.cc = 2
    AND t.cc = (
        SELECT COUNT(*)
        FROM employe
        WHERE empID = t.empID
    )

Second Solution

SQL Fiddle

SELECT e.empId
FROM employe e
WHERE e.department IN('Y', 'Z')
GROUP BY e.empID
HAVING
    COUNT(e.department) = 2
    AND COUNT(e.department) = (SELECT COUNT(*) FROM employe WHERE empID = e.empId)

不使用GROUP BYHAVING:

SELECT DISTINCT e.empID
FROM employe e
WHERE
    EXISTS(
        SELECT 1 FROM employe WHERE department = 'Z' AND empID = e.empID
    )
    AND EXISTS(     
        SELECT 1 FROM employe WHERE department = 'Y' AND empID = e.empID
    )
    AND NOT EXISTS(
        SELECT 1 FROM employe WHERE department NOT IN('Y', 'Z') AND empID = e.empID
    )

Postgresql相关问答推荐

如何在gorm中创建一个可读但不可写的字段

如何在postquist中修剪第一/后文件名

Docker化的PostgreSQL:FATAL:用户&postgres的密码身份验证失败

可以向判断枚举值的SQL列添加约束吗?

SQLX::Query!带有UUID::UUID的宏在Rust中编译失败

未更改表上的 Postgres 环绕预防

配置:错误:C 编译器无法在 Ubuntu 中创建可执行文件

如何计算每月的出版物数量?

查找最小值和最大值

postgreSQL 中对 utf-8 的 LC_COLLATE 和 LC_CTYPE 支持

等效于 Postgresql 中的 FOUND_ROWS() 函数

Sidekiq - 无法在 5.000 秒内获得数据库连接

如何在 psql 控制台中打印当前工作目录?

在 Postgresql 中拆分逗号分隔的字段并对所有结果表执行 UNION ALL

使用 PostgreSQL 创建数据透视表

如何使 array_agg() 像 mySQL 中的 group_concat() 一样工作

使用 SQLAlchemy 进行 PostgreSQL ILIKE 查询

psql 将默认 statement_timeout 设置为 postgres 中的用户

错误:索引表达式中的函数必须在 Postgres 中标记为 IMMUTABLE

postgresql NOT ILIKE 子句不包含空字符串值