Еще одна сложная проблема запроса SQL 2000
У меня есть две таблицы, которые я хочу использовать в своем запросе, tblEmployee
а также tblEmpPerformance
Требование:
С помощью tblEmployee.EmpID, tblEmployee.ManagerID
, пройти через tblEmpPerformance
и посмотри на tblEmpPerformance.SalaryRaise
а также tblEmpPerformance.CommissionRaise
и обновить tblEmployee
соответственно.
Только одно из этих двух полей будет иметь ненулевое значение для каждой записи в tblEmpPerformance
if tblEmployee.EmpID = tblEmpPerformance.EmpID then
If tblEmpPerformance.Salary > 0 then
update tblEmployee
Set CompensationType = 'Salary'
Where tblEmployee.EmpID = tblEmpPerformance.EmpID
AND tblEmployee.ManagerID = tblEmpPerformance.ManagerID
update tblEmployee
Set SalaryRaise = tblEmpPerformance.SalaryRaise
Where tblEmployee.EmpID = tblEmpPerformance.EmpID
AND tblEmployee.ManagerID = tblEmpPerformance.ManagerID
If tblEmpPerformance.Commission > 0 then
update tblEmployee
Set CompensationType = 'Commission'
Where tblEmployee.EmpID = tblEmpPerformance.EmpID
AND tblEmployee.ManagerID = tblEmpPerformance.ManagerID
update tblEmployee
Set CommissionRaise = tblEmpPerformance.CommissionRaise
Where tblEmployee.EmpID = tblEmpPerformance.EmpID
AND tblEmployee.ManagerID = tblEmpPerformance.ManagerID
Если нет соответствия EmpID
найдено, тогда загляните в tblContractorPerformance
if tblEmployee.EmpID = tblContractorPerformance.EmpID then
If tblContractorPerformance.Salary > 0 then
update tblEmployee
Set CompensationType = 'Salary'
Where tblEmployee.EmpID = tblContractorPerformance.EmpID
AND tblEmployee.ManagerID = tblContractorPerformance.ManagerID
....
....
....
....
Next tblEmployee.EmpID
Обновление: DOH!!.. Что было бы лучшим способом написать этот запрос SQL. Хранится проц или курсор? Любые предложения о том, как разработать запрос, также могут помочь
2 ответа
Пожалуйста, избегайте курсоров. Думайте на основе набора в работе с вашими данными. Так что выполните на вашем первом наборе данных, где tblEmpPerformance.Salary > 0
, Сделайте ваши обновления, затем выполните вторую операцию на следующем наборе данных, где tblEmpPerformance.Commission > 0
, Наконец, обновите все данные, где tblContractorPerformance.Salary > 0
,
Поместите эти операции в хранимую процедуру, и я уверен, что вы увидите лучшую производительность, чем при использовании курсоров.
Насколько я могу судить, вы можете заключить это в один запрос:
Update tblEmployee
Set CompensationType = Case
When EP.Commission > 0 Then 'Commission'
When EP.Salary > 0 Then 'Salary'
When CP.Salary > 0 Then 'Salary'
Else E.CompensationType -- leave value as is
End
, CommissionRaise = Case
When EP.Commission > 0 Then EP.CommissionRaise
Else E.CommissionRaise -- leave value as is
End
, SalaryRaise = Case
When EP.Commission > 0 Then E.SalaryRaise
When EP.Salary > 0 Then EP.SalaryRaise
When CP.Salary > 0 Then CP.SalaryRaise
Else E.SalaryRaise -- leave value as is
End
From tblEmployee As E
Left Join tblEmployeePerformance As EP
On EP.EmpID = E.EmpID
And EP.ManagerId = E.ManagerId
Left Join tblContractorPerformance As CP
On CP.EmpID = E.EmpID
And CP.ManagerId = E.ManagerId