假设我有一个名为Catalog的表,如下所示:
Course Number CourseName CourseDsc PreReq
1028 CS146 Data S... 1005
1028 CS146 Data S... 2000
1028 CS146 Data S... 2003
和另一个名为PreviousCourses的表格如下:
Username PrevCoursesID Grade
admin 1005 A
admin 2000 A
现在这个用户管理员没有达到CS146课程的先决条件,因为他有三个先决条件中的两个(1005和2000),但缺少先决条件2003.我的查询设置方式它是检查PreviousCourses是否是Catalog的子集。基本上,如果某些课程满足任何先决条件,则允许用户注册该课程。我希望我的查询表明,如果满足某个课程的目录中的所有先决条件,则用户只能注册。 我的查询尝试:
"Select PrevCoursesID, Grade from PreviousCourses where "
+ "Grade <= 'D' AND "
+ "PrevCoursesID IN (Select PreReq from Catalog where CourseNumber = '" + courseID + "') AND"
+ " Username = '" + currentUser + "'";
更新:刚试过这个查询,这似乎无法正常工作
SELECT CATALOG.prereq, previouscourses.grade
FROM CATALOG LEFT JOIN PREVIOUSCOURSES ON
CATALOG.prereq=PREVIOUSCOURSES.PREVCOURSESID AND
PREVIOUSCOURSES.GRADE<='D' WHERE PREVIOUSCOURSES.USERNAME='ADMIN'
AND CATALOG.COURSENUMBER='1028'
答案 0 :(得分:0)
使用以下查询,然后浏览生成的记录集以检查PreviousCourses.Grade
值是否为NULL
。如果有,则前提条件未完全满足。
请注意,LEFT OUTER JOIN
结合缺少任何类型的WHERE
子句,可以保证您为每个先决条件获取一行,并通过包含通过的成绩和用户标准JOIN
条件,您可以避免检查需要识别传递(因此只检查NULL
)。
SELECT
Catalog.PreReq,
PreviousCourses.Grade
FROM
Catalog
LEFT OUTER JOIN PreviousCourses ON
Catalog.PreReq = PreviousCourses.PrevCoursesID
AND
PreviousCourses.Grade <='D'
AND
PreviousCourses.Username = 'admin'
此外,这是SQL Server语法。您没有用实际的数据库服务器标记问题,只是sql。因此,如果您正在使用mysql或sqlite或其他变体,这种方法仍然有效,但语法可能需要调整。
答案 1 :(得分:0)
这些是用户可以使用的类:
DECLARE @UserName varchar(255) = 'admin'
SELECT c.[Course Number]
FROM Catalog c
GROUP BY c.[Course Number]
HAVING COUNT(1) = (SELECT COUNT(DISTINCT pc.PreReq)
FROM PreviousCourses pc
WHERE pc.Username = @UserName
AND c.PreReq = pc.PrevCoursesID
AND pc.Grade IN ('A', 'B', 'C', 'P', 'Pass')
OR MAX(ISNULL(c.PreReq, 0)) = 0
ORDER BY c.[Course Number]
(这是SQL Server)