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

SQL查询正确性验证:查询参与项目30、40、50的员工详情

你的WHERE子句条件分析

嗨,我来拆解下你的问题:首先,你写的WHERE (Pnumber = 30 OR Pnumber = 40 OR Pnumber = 50)在语法层面是完全合法的,能筛选出参与这三个项目中任意一个的员工,但有几个可以优化和需要注意的点:

1. 条件写法可以更简洁

你可以把多个OR的判断简化成IN子句,可读性和维护性更好,效果完全一致:

WHERE Pnumber IN (30, 40, 50)

2. 注意重复数据的问题

因为一个员工可能同时参与多个目标项目(比如既做项目30又做项目40),你的JOIN查询会返回多条重复的员工记录——每匹配一个符合条件的项目,就会多一条相同的员工详情行。如果需要唯一的员工列表,得加上DISTINCT关键字:

SELECT DISTINCT Employee.* 
FROM Employee 
JOIN Timesheet ON Employee.Empno = Timesheet.Empno 
WHERE Pnumber IN (30, 40, 50)

或者用EXISTS子查询的方式,天生就能避免重复,性能也不错:

SELECT *
FROM Employee e
WHERE EXISTS (
    SELECT 1
    FROM Timesheet t
    WHERE t.Empno = e.Empno
    AND t.Pnumber IN (30, 40, 50)
)

3. 需求的精准性很重要

如果笔试的实际需求是员工必须同时参与30、40、50这三个项目(而不是参与其中任意一个),那你当前的条件就完全不符合了。这种场景需要用分组+筛选的方式:

SELECT e.*
FROM Employee e
JOIN Timesheet t ON e.Empno = t.Empno
WHERE t.Pnumber IN (30, 40, 50)
GROUP BY e.Empno, e.Fname, e.Lname, e.Bdate, e.Address, e.Salary, e.Dnumber
HAVING COUNT(DISTINCT t.Pnumber) = 3

总结

如果需求是获取参与30/40/50中任意一个项目的员工详情,你写的WHERE条件是合适的,但建议换成IN写法更简洁;如果需要去重,记得加DISTINCT或者用EXISTS。如果需求是必须同时参与三个项目,那就得调整成分组查询的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:04:46