微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试将带有子查询的CHECK转换为SQL中的函数时出现问题

如何解决尝试将带有子查询的CHECK转换为SQL中的函数时出现问题

这个问题我已经坐了好几个小时了,我快要疯了。我希望每个学生最多只能学习45个课程学分。在这一点上,它禁止添加超过45个CourseCredit。我应该如何重新排列功能CheckCredits?

CREATE TABLE Student
(
    studentID VARCHAR(5),studentName VARCHAR(20),studentAddress VARCHAR(20),CONSTRAINT student_pk PRIMARY KEY(studentID)
)

CREATE TABLE Course
(
    courseID VARCHAR(5),courseCredits INT,courseName VARCHAR(20),CONSTRAINT course_pk PRIMARY KEY(courseID)
)

CREATE TABLE Studies
(
    studentID VARCHAR(5),courseID VARCHAR(5),CONSTRAINT studies_pk PRIMARY KEY(studentID,courseID),CONSTRAINT studies_fk_student FOREIGN KEY(studentID) REFERENCES Student(studentID) ON DELETE CASCADE,CONSTRAINT studies_fk_course FOREIGN KEY(courseID) REFERENCES Course(courseID) ON DELETE CASCADE
)

CREATE TABLE Hasstudied
(
    studentID VARCHAR(5),grade VARCHAR(1),CONSTRAINT has_studied_pk PRIMARY KEY(studentID,CONSTRAINT has_studied_fk_student FOREIGN KEY(studentID) REFERENCES Student(studentID) ON DELETE CASCADE,CONSTRAINT has_studied_fk_course FOREIGN KEY(courseID) REFERENCES Course(courseID) ON DELETE CASCADE
)

GO
CREATE FUNCTION CheckCredits()
RETURNS INT
AS 
BEGIN
   DECLARE @returnvalue INT
   SELECT @returnvalue = (SELECT SUM(courseCredits) FROM Course c where c.courseID IN(
    SELECT s.courseID FROM Studies s JOIN Student st ON s.studentID = st.studentID OR c.courseID = s.courseID))
   RETURN @returnvalue
END;
GO

ALTER TABLE Studies 
ADD CONSTRAINT chkCredits CHECK (dbo.CheckCredits() <= 45);  



INSERT INTO Student VALUES('S1','Joe','Street')
INSERT INTO Student VALUES('S2','Street')
INSERT INTO Student VALUES('S3','Street')
INSERT INTO Student VALUES('S4','Street')

INSERT INTO Course VALUES('C1',45,'Biology')
INSERT INTO Course VALUES('C2',15,'History')
INSERT INTO Course VALUES('C3',35,'English')
INSERT INTO Course VALUES('C4',20,'Music')

INSERT INTO Studies VALUES('S1','C1')
INSERT INTO Studies VALUES('S2','C2')
INSERT INTO Studies VALUES('S3','C3')

解决方法

更改功能以返回每个学生的最大学分。像这样:

CREATE FUNCTION CheckCredits()
RETURNS INT
AS 
BEGIN
    DECLARE @returnvalue INT
    SELECT TOP 1 @returnvalue = SUM(courseCredits) 
    FROM Studies s 
    JOIN Course c ON s.courseID = c.courseID 
    GROUP BY s.studentID 
    ORDER BY SUM(courseCredits)  desc 

   RETURN @returnvalue
END;
GO

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。