Reputation: 640
I want the parameter 'HoursPerWeek' to Equal the number of pupils with a specific Teachers ID. I'm really lost on how to go about this.
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
Upvotes: 0
Views: 66
Reputation: 15977
The answer of @McNets is correct, but there can be modifications:
Better use table aliases and there is no need for sub-query:
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
Upvotes: 1
Reputation: 38023
Without using a specific Teacher_ID
parameter:
Correlated subquery version:
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
Note: Why you should always include set xact_abort, nocount on;
- Erland Sommarskog
Upvotes: 0
Reputation: 10807
If you try to update HourPerWeek
and with a specific Teachers ID
, you should add a parameter to your stored procedure just to indicate the Teacher_ID.
NOTE: I've used a int
value change it according your table schema.
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
Upvotes: 2