具有多个条件的 SQL 查询不起作用
Posted
技术标签:
【中文标题】具有多个条件的 SQL 查询不起作用【英文标题】:SQL Query with multiple conditions not working 【发布时间】:2021-07-07 20:29:53 【问题描述】:好的,这是我进行查询的最佳尝试。它目前正在执行,但没有返回任何其他尝试都没有奏效的内容。
我认为这些连接是错误的,我不确定如何修复它们或正确处理
在此查询中,我试图获取分配给符合以下所有条件的活动的员工的活动详细信息。
员工和活动在分配表中链接,其中员工 ID 分配给那里的活动 ID。
--2019年在某个校区至少教授2个模块
staffID 必须在 Teach 表中的 StaffID 字段中至少出现两次
spaID 5 或 6 将对应于校园,因此此时教授两个模块和 ID。
--监督超过 1 位同事
这是在员工表中,SupervisorID 是同一表中 StaffID 的外键。
因此,分配给活动的员工 ID 需要监督多个同事,他们的 ID 在 SupervisorID 中出现多次。
--相关活动是内部活动
如果等于 1,则该活动是内部的。
所以总结起来,活动详情应该只出现在查询结果中,如果它有符合上述所有条件的员工
SELECT Activity.AcID, Activity.Title, Activity.CaID, Activity.Internal, Activity.BuID, Budget.Amount FROM Activity
INNER JOIN Budget ON Activity.AcID = Budget.BuID
INNER JOIN Allocation ON Activity.AcID = Allocation.AcID
INNER JOIN Staff ON Allocation.StaffID = Staff.StaffID
INNER JOIN Teach ON Allocation.StaffID = Teach.StaffID
WHERE Activity.Internal=1 AND
Allocation.StaffID IN (
SELECT Staff.SupervisorID
FROM Staff
GROUP BY StaffID
HAVING COUNT(Staff.SupervisorID=Allocation.StaffID) >1)
AND Allocation.StaffID IN (
SELECT Teach.StaffID
FROM Teach
WHERE Teach.Year='2019' AND Teach.SpaID=5 OR 6
GROUP BY Teach.StaffID
HAVING COUNT(Allocation.StaffID=Teach.StaffID) >=2);
如果您想查看更多详细信息,请在下方查看表格详细信息
表活动 -- AcID, Title, CaID, BuID, Status, Started, Ended Internal
表分配 -- StaffID, AcID
餐桌预算 -- BuID, Amount, Approver, Payee, Status
Table Campus -- CaID, Address, GmName, Country, Status
桌教室 -- RmID, Capacity, CaID, Location, Type, Status
表格模块 -- ModuleID, Module Name, DeptID, Programme, TMode, Date_of_Firstoffer
表空间分配 -- SpaID, RmID, TID, Manager, Approved
餐桌员工 -- StaffID, Title, FirstName, LastName, DeptID, CaID, Joined, LeftD, Current, Salary, ContractType, SupervisorID
餐桌教学 -- TID, ModuleID, StaffID, SpaID, Semester, Year
我已尽力解释清楚,如有任何混淆,我深表歉意。
【问题讨论】:
请分享示例输入数据、根据该示例的预期输出以及正确形式的表结构(带有列类型)。这样可以更轻松地重现您的问题 对不起,我想我可能有部分工作,我使用的测试数据可能是问题,所以我想我会在这里结束问题,同时我整理并再次尝试修复它 【参考方案1】:如果无法访问数据很难判断,但您可以尝试将 inner joins
更改为 left joins
并且:
这个
WHERE Teach.Year='2019' AND Teach.SpaID=5 OR 6
应该是
WHERE Teach.Year='2019' AND (Teach.SpaID=5 OR Teach.SpaID=6)
这看起来也不正确:
INNER JOIN Budget ON Activity.AcID = Budget.BuID
应该是:
INNER JOIN Budget ON Activity.BuID = Budget.BuID
【讨论】:
【参考方案2】:没有数据很难找到解决方案。请试试这个:
SELECT Activity.AcID, Activity.Title, Activity.CaID, Activity.Internal, Activity.BuID, Budget.Amount FROM Activity
INNER JOIN Budget ON Activity.AcID = Budget.BuID
INNER JOIN Allocation ON Activity.AcID = Allocation.AcID
INNER JOIN Staff ON Allocation.StaffID = Staff.StaffID
INNER JOIN Teach ON Allocation.StaffID = Teach.StaffID
WHERE Activity.Internal=1 AND
Allocation.StaffID IN (
SELECT Staff.SupervisorID
FROM Staff
GROUP BY SupervisorID
HAVING COUNT(*) >1)
AND Allocation.StaffID IN (
SELECT Teach.StaffID
FROM Teach
WHERE Teach.Year='2019' AND Teach.SpaID=5 OR 6
GROUP BY Teach.StaffID
HAVING COUNT(*) >=2);
【讨论】:
以上是关于具有多个条件的 SQL 查询不起作用的主要内容,如果未能解决你的问题,请参考以下文章
在 AND 内具有多个 OR 条件的 SQL 查询返回 null 或空
与 UNION 一起使用时,对每个 SQL Server 查询都不起作用的排序