簡體   English   中英

如何使用存儲過程更新另一個表中的所有列和行

[英]How to update all columns and rows from another table with a stored procedure

我有幾張桌子上大學。

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    

數據應僅存在於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,

)

也許您可以嘗試一下。

/* 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查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM