具有多个条件的 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 查询不起作用的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询不起作用 - 使用 Where 条件不匹配

在 AND 内具有多个 OR 条件的 SQL 查询返回 null 或空

与 UNION 一起使用时,对每个 SQL Server 查询都不起作用的排序

sql left join on查询条件不起作用

PDO SQL 我正在尝试将我的 SQL 查询设置为检查多个列,但它不起作用 [重复]

根据多个筛选条件 - SQL访问排除记录