You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite技术问询:如何查询同时属于两个部门列表的员工ID

问题原因与可行SQL方案

你的原查询没有结果,核心原因是单条DepartmentLink记录的departmentId不可能同时属于两个不重叠的部门列表(比如既在1/2/3里,又等于100),这是逻辑矛盾,自然查不到数据。

在SQLite里完全可以实现你的需求,下面提供几种实用方案:

方案1:分组统计+HAVING筛选

通过分组员工ID,统计其满足两个部门条件的记录数,确保两个条件都至少满足一次:

SELECT dl.employeeId
FROM DepartmentLink dl
WHERE dl.departmentId IN (1,2,3) OR dl.departmentId = 100
GROUP BY dl.employeeId
HAVING 
    SUM(CASE WHEN dl.departmentId IN (1,2,3) THEN 1 ELSE 0 END) >= 1
    AND SUM(CASE WHEN dl.departmentId = 100 THEN 1 ELSE 0 END) >= 1;

如果需要关联员工表获取姓名,直接添加JOIN即可:

SELECT e.id, e.name
FROM Employee e
INNER JOIN DepartmentLink dl ON e.id = dl.employeeId
WHERE dl.departmentId IN (1,2,3) OR dl.departmentId = 100
GROUP BY e.id, e.name
HAVING 
    SUM(CASE WHEN dl.departmentId IN (1,2,3) THEN 1 ELSE 0 END) >= 1
    AND SUM(CASE WHEN dl.departmentId = 100 THEN 1 ELSE 0 END) >= 1;

方案2:EXISTS子查询

通过两个EXISTS分别验证员工是否存在于两个部门的关联记录中,逻辑更直观:

SELECT e.id, e.name
FROM Employee e
WHERE 
    EXISTS (
        SELECT 1 FROM DepartmentLink dl 
        WHERE dl.employeeId = e.id AND dl.departmentId IN (1,2,3)
    )
    AND EXISTS (
        SELECT 1 FROM DepartmentLink dl 
        WHERE dl.employeeId = e.id AND dl.departmentId = 100
    );

通过两次内连接,筛选同时存在两个部门关联的员工:

SELECT DISTINCT e.id, e.name
FROM Employee e
INNER JOIN DepartmentLink dl1 ON e.id = dl1.employeeId AND dl1.departmentId IN (1,2,3)
INNER JOIN DepartmentLink dl2 ON e.id = dl2.employeeId AND dl2.departmentId = 100;

这里加DISTINCT是避免同一员工因关联多个A列表部门而重复出现。

内容的提问来源于stack exchange,提问作者Christiaan Maks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:43:21