尝试将带有子查询的 CHECK 转换为 SQL 中的函数时出现问题
Problem when trying to convert CHECK with subqueries to a function in SQL
我已经被这个问题困扰了几个小时,我快要发疯了。我希望每个学生最多只能学习 45 个课程学分。此时它禁止我添加超过 45 个 CourseCredits。我该如何重新排列 Function 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),
courseID VARCHAR(5),
grade VARCHAR(1),
CONSTRAINT has_studied_pk PRIMARY KEY(studentID,courseID),
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', 'Joe', 'Street')
INSERT INTO Student VALUES('S3', 'Joe', 'Street')
INSERT INTO Student VALUES('S4', 'Joe', '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')
将函数更改为 return 每个学生的最大学分。像这样:
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
我已经被这个问题困扰了几个小时,我快要发疯了。我希望每个学生最多只能学习 45 个课程学分。此时它禁止我添加超过 45 个 CourseCredits。我该如何重新排列 Function 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),
courseID VARCHAR(5),
grade VARCHAR(1),
CONSTRAINT has_studied_pk PRIMARY KEY(studentID,courseID),
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', 'Joe', 'Street')
INSERT INTO Student VALUES('S3', 'Joe', 'Street')
INSERT INTO Student VALUES('S4', 'Joe', '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')
将函数更改为 return 每个学生的最大学分。像这样:
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