여러 가지 방법으로 수행 할 수 있습니다.
처음에는 왜 정상적인 업데이트를 수행하지 않는지 궁금합니다.
update emp
set salary = emp.salary + (bonus * 2)
from employee emp
join bonuses bon on bon.employee_id = emp.employee_id
where bon.deserved = 1
또 다른 방법은 커서를 사용하는 것입니다,하지만 사람들은 때문에 성능 문제의 그들처럼 정말하지 않습니다 :
https://docs.microsoft.com/en-us/sql/t-sql/language-elements/declare-cursor-transact-sql
또 다른 방법은, 동안 직원 수를 보유하는 컨테이너를 생성하는 것입니다 현재 반복이 카운트와 같지 않고 각 루프에서 필요한 직원을 잡아 당기는 동안 (예 :
declare @employeecount int = (select count(*) from employee)
declare @current int = 1
while @current <= @employeecount
begin
declare @employeeid uniqueidentifier = (select top 1 employee_id from (select top (@current) * from employee order by employee_id asc) tmp order by employee_id desc)
-- Grab Employee and run logic
set @current = @current + 1;
end
하단은 거의 커서가하는 일을 처리하지만 커서가 더 잘 수행하는 것으로 나타났습니다.
내가 최근에 한 일은 다음과 같습니다. 나는 따라하기 쉽다는 것을 알았다.
declare @ids table (id uniqueidentifier)
insert into @ids
select employee_id
from employee
while (select count(*) from @ids) > 0
begin
declare @employeeid uniqueidentifier = (select top 1 employee_id from @ids)
-- Grab Employee and run logic
delete from @ids where id = @employeeid
end
내가 마지막으로 좋아하지만, 몇 가지 문제가있는 것으로 보입니다. 반복은 각 ID에 없으며 일부 보너스는 ID 사이에 섞여있을 수 있습니다. – jou
나는 비슷한 것을하고 싶다. (employee_id desc로 employee_id 오름차순으로 employee order from (current value)를 선택한다. 나는 다른 방법을 사용했는데, 큰 코드에서 더 쉽게 읽고 더 쉽게 찾을 수 있습니다. – Monofuse
당신의 논리를 시험해 보겠습니다. – jou