Как обновить все столбцы и строки из другой таблицы с помощью хранимой процедуры - PullRequest
0 голосов
/ 09 мая 2019

У меня есть несколько столиков для колледжа.

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 Таблица

Я работал над несколькими итерациями кода, чтобы попытаться найти ответ, и это мой последний вариант.Я действительно ценю любую помощь.

Нет параметров для этого процесса.

ROUTINE NAME: 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 ]

1 голос
/ 09 мая 2019

Данные должны жить только в 1 месте во вселенной. Хранить данные суммирования процедур - плохая идея. Представление больше подходит для этой проблемы.

Все таблицы должны иметь столбец идентификаторов. Не уверен из вашего вопроса, как таблицы связаны друг с другом. Но если бы у вас были столбцы идентификаторов, то ваш взгляд был бы таким:

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,

)
0 голосов
/ 09 мая 2019

Может быть, вы можете попробовать это.

/* 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.Например, вы можете вызвать запрос UPDATE внутри цикла PHP для каждого колледжа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...