Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用存储过程更新另一个表中的所有列和行_Mysql_Sql - Fatal编程技术网

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

Mysql 如何使用存储过程更新另一个表中的所有列和行,mysql,sql,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 var

我有几张大学的桌子

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,不带基于Apply、College和Student表的参数

我已经对代码进行了多次迭代,试图找到一个答案,这是我最近的一次。我真的很感激任何和所有的帮助

此过程没有参数

例程名称:UpdateCollegestSall

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    

也许你可以试试这个

/* 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循环中为每个学院调用更新查询

数据应该只存在于宇宙中的一个地方。让存储的过程汇总数据是个坏主意。视图更适合于此问题

所有表都应该有一个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,

)

将查询分解为各个部分。考虑一下应用中的select count*将返回什么。它将返回20。因此,您的更新实际上是更新集合appCount=20。。。其余的列也是如此。您需要了解如何使用连接进行更新。您可能想参考这个答案,这是针对哪个RDBMS的?请添加一个标记,以指定您使用的是mysql、postgresql、sql server、oracle还是db2,或者其他完全不同的东西。@marc_’s好的,我这样做了。至少在大多数现代DBMS中,这可以通过一个UPDATE或MERGE语句轻松完成。不需要循环、变量或其他程序元素。顺便说一句:你的答案没有使用SQL——它使用的是微软的t-SQL。目前还不清楚meowmix使用的是哪种DBMS产品