Още един сложен проблем с 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 заявка. Съхранен процес или курсор? Всяко предложение за това как да проектирате заявката също би било от голяма помощ


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
БЛАГОДАРЯ ВИ БЛАГОДАРЯ ВИ БЛАГОДАРЯ ВИ !!!!!!!!!! Това беше моето предложение, но беше свалено от горния mgmt. Благодаря ви, за да благодарите за валидирането на моето решение. :-) - person user279521; 01.03.2011
comment
хаха Имам анекдотични доказателства - имах много съхранени процедури, които бяха базирани на курсора. те отнеха часове, за да бягат. Пренаписах ги въз основа на набор и отнеха общо около 30 секунди. - person Nathan DeWitt; 01.03.2011
comment
По някаква причина, колкото по-дълго време отнема обработката на заявката, толкова повече клиентът смята, че това са сложни неща, които правят за нас... струват си таксата от $250/час. Както и да е, имам бай-ин от upper mgmt. Всички щастливи!! :-) - 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