如何使用存储过程更新另一个表中的所有列和行

时间:2019-05-09 01:42:46

标签: mysql sql

我有几张大学桌子。

Apply (sID int(3), cName varchar(20), major varchar(20), decision char(1))
College (cName char(20), state char(2), enrollment int(11))
Student (sid char(6), sName char(20), GPA decimal(3,2), sizeHS int(11))

我创建了此表:

CollegeStats (cName varchar(20), appCount int(11), minGPA decimal(3,2), maxGPA decimal(3,2))

我需要创建一个存储过程,该存储过程更新CollegeStats,而没有基于ApplyCollegeStudent表的参数。

我已经进行了几次代码迭代,以求得出答案,这是我的最新版本。我非常感谢您提供的所有帮助。

此过程没有参数。

例程名称:updateCollegeStatsAll

BEGIN
    UPDATE CollegeStats 
    SET appCount = (SELECT COUNT(*) FROM Apply),
        minGPA = (SELECT MIN(GPA) FROM Student),
        maxGPA = (SELECT MAX(GPA) FROM Student);
END

当我运行此代码时,它将所有行更新为相同。

cName   appCount    minGPA  maxGPA  
-----------------------------------
Cornell  20         2.90    4.00    
MIT      20         2.90    4.00    
CALTEC   20         2.90    4.00    
Davis    20         2.90    4.00    

2 个答案:

答案 0 :(得分:1)

数据应仅位于Universe中的1个位置。具有存储的过程摘要数据是一个坏主意。视图更适合解决此问题。

所有表都应有一个ID列。从您的问题中不确定表如何相互关联。但是,如果您有ID列,则视图将如下所示:

CREATE VIEW vCollageStats AS
(
    SELECT c.cName,
        COUNT(DISTINCT a.Id) AS AppCount,
        MIN(s.GPA) AS MinGPA,
        MAX(s.GPA) AS MaxGPA
    FROM College c
    LEFT JOIN Apply a
    ON c.Id = a.CollegeId
    LEFT JOIN Student s
    ON a.StudentId = s.Id
    GROUP BY c.cName,

)

答案 1 :(得分:0)

也许您可以尝试一下。

/* Create a dummy table to store student and their respective college id */
DECLARE @stud_clg TABLE (sid char(6),GPA decimal(3,2),cName varchar(20))
INSERT INTO @stud_clg 
SELECT A.sid, A.GPA, B.cName FROM 
Student A INNER JOIN Apply B 
ON A.sid = B.sID

/* Create a dummy table to store college and their student count */
DECLARE @clgstudct TABLE (cName varchar(20), ct int(11))
INSERT INTO @clgstudct
SELECT cName,COUNT(*) FROM @stud_clg 
GROUP BY cNAME

/* Update your actual table using WHILE loop */
DECLARE @ctrow int = (SELECT COUNT(*) FROM @clgstudct)
DECLARE @studct int(11)
DECLARE @clgname varchar(20)

/* Begin While loop */
WHILE @ctrow != 0
BEGIN
SET @studct = (SELECT TOP 1 ct FROM @clgstudct)
SET @clgname = (SELECT TOP 1 cNAME FROM @clgstudct)
DELETE FROM @clgstudct WHERE cName = @clgname

/* Update statement */
UPDATE CollegeStats SET
appCount = @studct,
minGPA = (SELECT MIN(GPA) FROM @stud_clg WHERE cName = @clgname),
maxGPA = (SELECT MAX(GPA) FROM @stud_clg WHERE cName = @clgname)
WHERE cName = @clgname
/* End Update statement */

SET @ctrow = (SELECT COUNT(*) FROM @clgstudct)
END
/* End While loop */

因为我没有您的表的实际记录(并且我懒得插入虚拟数据进行测试),所以我无需使用任何编译器就可以对此进行编码,而只是基于我的逻辑。我希望这个对你有用。如果遇到任何问题,请发表评论,我将尝试修复它。这种方法似乎太长了,我认为应该有一个更简单的解决方案。

此外,我认为这种逻辑应使用PHP,VB或C#等编程语言而不是SQL来完成。例如,您可以为每所大学在PHP循环内调用UPDATE查询。