2017-03-26 2 views
0

Ich möchte den Parameter 'HoursPerWeek' gleich der Anzahl der Schüler mit einer bestimmten Lehrer ID. Ich bin wirklich verloren, wie das geht.UPDATE-Spalte mit COUNT

CREATE PROC spUpdateTeachingHoursAndWages 
AS 
update Payments.HoursPerWeek 
set HoursPerWeek = (select COUNT(PupilDetails.Teacher_ID) 
FROM Assignment.dbo.Payments JOIN Assignment.dbo.PupilDetails 
ON Payments.ID = PupilDetails.Teacher_ID 

Antwort

2

Wenn Sie versuchen, HourPerWeek und with a specific Teachers ID zu aktualisieren, sollten Sie einen Parameter der gespeicherten Prozedur fügen Sie einfach den Teacher_ID anzuzeigen.

HINWEIS: Ich habe einen int Wert verwendet, ändern Sie es nach Ihrem Tabellenschema.

CREATE PROC spUpdateTeachingHoursAndWages (@Teacher_ID int) 
AS 
    UPDATE Payments 
    SET HoursPerWeek = (SELECT COUNT(PupilDetails.Teacher_ID) 
          FROM Assignment.dbo.Payments 
          JOIN Assignment.dbo.PupilDetails 
          ON  Payments.ID = PupilDetails.Teacher_ID 
          WHERE Payments.ID = @Teacher_id) 
    WHERE Payments.ID = @Teacher_ID 
+0

Vielen Dank, aber ich bin immer ein 'ungültiges Objekt name' Fehler für HoursPerWeek. Will versuchen zu sehen, was den Konflikt verursacht. –

+0

Es tut mir leid, ich dachte Payments war Schemaname, aber es ist der Tabellenname, entfernen .HoursPerWeek – McNets

+0

Danke für die Antwort, ich habe es tatsächlich herausgefunden :) Danke für die Hilfe !! –

1

Die Antwort von @McNets ist richtig, aber es können Modifikationen:

Bessere Nutzung table aliases und es besteht keine Notwendigkeit für die Unterabfrage:

CREATE PROC spUpdateTeachingHoursAndWages --(@Teacher_ID int) 
AS 
UPDATE p 
SET HoursPerWeek = COUNT(pd.Teacher_ID) 
FROM Assignment.dbo.Payments p 
INNER JOIN Assignment.dbo.PupilDetails pd 
    ON p.ID = pd.Teacher_ID 
--WHERE p.ID = @Teacher_ID 
--Uncomment this, if you need to change HoursPerWeek for some special teacher 
0

Ohne eine spezifische Teacher_ID mit Parameter:

Korrelierte Unterabfrageversion:

create proc spUpdateTeachingHoursAndWages as 
begin; 
set nocount, xact_abort on; 
    update p 
    set HoursPerWeek = (
     select count(*) 
     from Assignment.dbo.PupilDetails pd 
     where pd.Teacher_id = p.id 
    ) 
    from Assignment.dbo.Payments p; 
end; 
go 

inner join Version:

create proc spUpdateTeachingHoursAndWages as 
begin; 
set nocount, xact_abort on; 
    update p 
    set HoursPerWeek = pd.HoursPerWeek 
    from Assignment.dbo.Payments p 
    inner join (
     select 
      pd.id 
     , HoursPerWeek = count(*) 
     from Assignment.dbo.PupilDetails pd 
     group by pd.id 
    ) pd 
     on p.id = pd.Teacher_id; 
end; 
go 

cross apply() Version:

create proc spUpdateTeachingHoursAndWages as 
begin; 
set nocount, xact_abort on; 
    update p 
    set HoursPerWeek = pd.HoursPerWeek 
    from Assignment.dbo.Payments p 
    cross apply(
     select HoursPerWeek = count(*) 
     from Assignment.dbo.PupilDetails pd 
     where p.id = pd.Teacher_id; 
    ) pd 
end; 
go 

Hinweis: Why you should always include set xact_abort, nocount on; - Erland Sommarskog