Еще одна сложная проблема запроса SQL 2000 - PullRequest
1 голос
/ 01 марта 2011

У меня есть две таблицы, которые я хочу использовать в своем запросе, 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 ]

3 голосов
/ 01 марта 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
2 голосов
/ 01 марта 2011

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

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

...