SQL检查两个表是否具有特定ID的相同数据

时间:2015-12-08 01:30:50

标签: mysql sql

假设我有一个名为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'

2 个答案:

答案 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)