我在为我的应用程序编写SQL查询时遇到困难。下面显示了我的数据库中的一些表的屏幕截图。
请让我解释我的应用程序的一部分如何工作,然后我可以向您展示我的SQL查询问题。
用户可以在我的系统上创建申请表(dbo.Form
)。申请表由几个部分组成,其中一个部分是就业历史(dbo.FormEmployment
)。就业记录包括雇主姓名,开始日期等详细信息,但也包括gradeID。用户可以在表dbo.FormEmployment
中添加一个或多个就业记录。
系统管理员可以向系统添加Shift(dbo.Shift
),然后将等级分配给Shift。这些成绩记录在dbo.ShiftGrade
表中。可以为Shift设置1个或更多等级,即可以分配1,2,3,4或5等等。
当系统管理员添加了Shift和Shift Grades时,我想要执行SQL查询以返回其成绩与分配给Shift的成绩相匹配的用户列表(请记住,用户在添加成绩时会添加成绩就业记录)。
我编写了以下SQL查询,但是,此查询的问题是它返回的用户列表,其中任何等级与分配给Shift的等级的等级相匹配。
SELECT u.userID, u.userTypeID, u.firstName, u.lastName, u.email, u.password,
u.contactNumber, u.organisationID, u.emailVerificationCode, u.mobileVerificationCode,
u.userStatusID, u.AddedBy, u.AddedDate, u.ModifiedBy, u.ModifiedDate
FROM [User] u
--Check Grades Match
WHERE u.userID IN
(
SELECT f.locumID
FROM dbo.Form f, dbo.FormEmployment emp
WHERE f.formID = emp.formID
AND emp.statusID = 101
AND emp.workYN = 1
AND emp.gradeID IN (
select gradeID from dbo.ShiftGrade where shiftID = @p0
)
)
您可以看到我正在使用IN语句执行此操作。但是,我只想返回一个用户列表,这些用户可以完全匹配已分配给Shift的相同等级。因此,如果为Shift分配了3个等级,那么我想要一个同样具有相同三个等级的用户列表。
我为冗长的帖子道歉,我只是觉得用这种方式解释得更好。 任何反馈或帮助都将非常感激。
答案 0 :(得分:1)
select u.*
from dbo.Users u
join dbo.Form f on u.? = f.formId
join dbo.FormEmployment fe on fe.formId = f.formId
join dbo.Grade g on g.gradeId = fe.gradeId
join dbo.ShiftGrade shg on shg.gradeId =g.gradeId
join dbo.Shift sh on sh.shiftId = shg.shiftId
where
sh.shiftId = -- recently added shift id
and g.gradeId == -- recently added grade id