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
相关产品推荐
相关产品推荐

