2016-05-29 5 views
1

Nehmen wir an, die Schüler können in der Warteschlange für mehrere verschiedene Kurse sein. Jeder Kurs hat seine eigene Warteschlange mit Studenten.Ändern Sie multiple Werte in einer Tabelle mit einer einzigen Aktualisierungsabfrage.

Die Tabelle wurde folgende: StudentID (int), courseid (int), Accepted (Bool) und QueueIndex (int). Jede studentID hat QueueIndex für jede courseID.

Wie aktualisiere ich alle QueueIndex für alle Warteschlangen, sobald ein Schüler z. entfernt wo er hingehört?

z. der Schüler A bekam QueueIndex 5 in Kurs A und QueueIndex 3 in Course B. möchte ich jeden anderen Schüler über diesem QueueIndex und CourseID eine verminderte --value erhalten, so dass der nächste Schüler in Kurs A, die QueueIndex 6 hatte haben QueueIndex 5 statt usw. .

UPDATE [Register] 
SET QueueIndex = QueueIndex -1 
WHERE QueueIndex > 0 
AND (decrease QueueIndex for every CourseID where that specific StudentID left the queue); 

Ist dies mit einer einzigen Abfrage möglich?

Antwort

1

Hört sich an, dass ein Schüler mehrmals dort ist, wenn sie in mehreren Kursen sind? Wenn sie einen Kurs dann ...

UPDATE table SET queue = queue - 1 WHERE queue > queuenumber /*the student that was removed queue number*/ AND course = courseid /*the course id of the course that the student was removed from */ 

Ich bin auf meinem Telefon so leid, wenn es Tippfehler gibt. Lass es mich wissen.

1

Warum müssen Sie den QueueIndex überhaupt aktualisieren?

SELECT StudentID, CourseID, 
    (SELECT Count(StudentID) FROM Register R 
    WHERE R.CourseID = Register.CourseID AND 
    R.QueueIndex <= Register.QueueIndex) AS QueueNr 
FROM Register 

Dies würde Ihnen den QueueIndex geben, egal wer entfernt wurde.

1

Sie können Trigger verwenden, um die Aktualisierung durchzuführen, wenn eine DELETE-Anweisung ausgelöst wird. Im Folgenden Code kann Ihnen helfen:

CREATE TRIGGER tr_Delete_Update_Register ON dbo.Register 
    FOR DELETE 
AS 
    BEGIN 
     UPDATE Register 
     SET  QueueIndex = QueueIndex - 1 
     WHERE QueueIndex > 0 
       AND QueueIndex > (SELECT QueueIndex 
            FROM  deleted 
           ) 
    END   

Dieser Trigger nur alle QueueIndex für QueueIndex größer als die gelöschte QueueIndex aktualisiert. Andernfalls, wenn Sie alle QueueIndex aktualisieren möchten, kommentieren Sie einfach die AND-Bedingung aus der WHERE-Klausel.

Verwandte Themen