SQL 多条件查询无效
SQL Query with multiple conditions not working
好的,这是我进行查询的最佳尝试。它当前正在执行,但 returns 其他尝试都没有奏效。
我认为联接是错误的,我不确定如何修复它们或正确执行此操作
在此查询中,我试图获取 activity 详细信息,其中包含分配给符合以下所有条件的那些活动的员工。
员工和活动在分配 table 中链接,员工 ID 分配给那里的 Activity ID。
--2019年在某校区至少教授2个模块
staffID 必须在 Teach table 字段 StaffID
中至少出现两次
spaID 5 或 6 对应校区所以此时教两个模块和 ID。
--主管1个以上同事
这在员工 table 中,SupervisorID 是同一 table 中 StaffID 的外键。
所以分配给activity的Staff ID需要监管不止一个同事,并且他们的ID在SupervisorID中出现不止一次
--相关的activity是内部的
如果 activity 等于 1,则它是内部的。
所以综上所述,activity 详细信息只有在员工符合上述所有条件时才会出现在查询结果中
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);
Table详情如下
Table Activity -- AcID, Title, CaID, BuID, Status, Started, Ended Internal
Table 分配 -- StaffID, AcID
Table 预算 -- BuID, Amount, Approver, Payee, Status
Table校园--CaID, Address, GmName, Country, Status
Table 教室 -- RmID, Capacity, CaID, Location, Type, Status
Table 模块 -- ModuleID, Module Name, DeptID, Programme, TMode, Date_of_Firstoffer
Table 空间分配 -- SpaID, RmID, TID, Manager, Approved
Table 员工 -- StaffID, Title, FirstName, LastName, DeptID, CaID, Joined, LeftD, Current, Salary, ContractType, SupervisorID
Table 教导 -- TID, ModuleID, StaffID, SpaID, Semester, Year
我已经尽力解释清楚了,如有任何混淆,请见谅。
如果不访问数据很难判断,但您可以尝试将 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
没有数据很难找到解决方案。请试试这个:
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);
好的,这是我进行查询的最佳尝试。它当前正在执行,但 returns 其他尝试都没有奏效。
我认为联接是错误的,我不确定如何修复它们或正确执行此操作
在此查询中,我试图获取 activity 详细信息,其中包含分配给符合以下所有条件的那些活动的员工。
员工和活动在分配 table 中链接,员工 ID 分配给那里的 Activity ID。
--2019年在某校区至少教授2个模块
staffID 必须在 Teach table 字段 StaffID
中至少出现两次spaID 5 或 6 对应校区所以此时教两个模块和 ID。
--主管1个以上同事
这在员工 table 中,SupervisorID 是同一 table 中 StaffID 的外键。
所以分配给activity的Staff ID需要监管不止一个同事,并且他们的ID在SupervisorID中出现不止一次
--相关的activity是内部的
如果 activity 等于 1,则它是内部的。
所以综上所述,activity 详细信息只有在员工符合上述所有条件时才会出现在查询结果中
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);
Table详情如下
Table Activity -- AcID, Title, CaID, BuID, Status, Started, Ended Internal
Table 分配 -- StaffID, AcID
Table 预算 -- BuID, Amount, Approver, Payee, Status
Table校园--CaID, Address, GmName, Country, Status
Table 教室 -- RmID, Capacity, CaID, Location, Type, Status
Table 模块 -- ModuleID, Module Name, DeptID, Programme, TMode, Date_of_Firstoffer
Table 空间分配 -- SpaID, RmID, TID, Manager, Approved
Table 员工 -- StaffID, Title, FirstName, LastName, DeptID, CaID, Joined, LeftD, Current, Salary, ContractType, SupervisorID
Table 教导 -- TID, ModuleID, StaffID, SpaID, Semester, Year
我已经尽力解释清楚了,如有任何混淆,请见谅。
如果不访问数据很难判断,但您可以尝试将 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
没有数据很难找到解决方案。请试试这个:
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);