Еще одна сложная проблема с запросом 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-запрос. Сохраненный Proc или курсор? Любое предложение о том, как разработать запрос, также будет большим подспорьем.


person user279521    schedule 01.03.2011    source источник
comment
Но в чем вопрос, собственно? Я сегодня толстый ›_‹   -  person rlb.usa    schedule 01.03.2011


Ответы (2)


Пожалуйста, избегайте курсоров. Думайте о наборе при работе с вашими данными. Итак, выполните на своем первом наборе данных, где tblEmpPerformance.Salary > 0. Сделайте свои обновления, затем выполните вторую операцию со следующим набором данных, где tblEmpPerformance.Commission > 0. Наконец, обновите все данные, где tblContractorPerformance.Salary > 0.

Поместите эти операции в хранимую процедуру, и я уверен, что вы увидите более высокую производительность, чем при использовании курсоров.

person Nathan DeWitt    schedule 01.03.2011
comment
СПАСИБО СПАСИБО СПАСИБО !!!!!!!!!! Это было мое предложение, но оно было отклонено верхним управлением. Спасибо, чтобы сказать спасибо за проверку моего решения. :-) - person user279521; 01.03.2011
comment
ржу не могу. У меня есть неофициальное свидетельство - у меня было множество хранимых процедур, основанных на курсорах. они бежали часами. Я переписал их на основе сетов, и в общей сложности они заняли около 30 секунд. - person Nathan DeWitt; 01.03.2011
comment
По какой-то причине, чем дольше обрабатывается запрос, тем больше клиент думает, что это сложная вещь, которую он делает для нас... они стоят 250 долларов в час. Во всяком случае, получил бай-ин от верхнего управления. Все счастливы!! :-) - person user279521; 01.03.2011
comment
да, консультанты за 250 долларов в час написали код CURSOR, затем я пришел, поскольку штатному программисту за 25 долларов в час пришлось переписать код, чтобы он действительно работал правильно. - person Nathan DeWitt; 02.03.2011

Насколько я могу судить, вы можете инкапсулировать это в один запрос:

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
person Thomas    schedule 01.03.2011