还有一个复杂的SQL2000查询问题

还有一个复杂的SQL2000查询问题,sql,sql-server,sql-server-2000,Sql,Sql Server,Sql Server 2000,我想在查询中使用两个表,tblEmployee和tblemperformance if tblEmployee.EmpID = tblEmpPerformance.EmpID then If tblEmpPerformance.Salary > 0 then update tblEmployee Set CompensationType = 'Salary' Where tblEmployee.EmpID = tblEmpPerformance.EmpID

我想在查询中使用两个表,
tblEmployee
tblemperformance

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 
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
要求是:

使用
tblEmployee.EmpID,tblEmployee.ManagerID
,浏览
tblemperformance
,查看
tblemperformance.SalaryRaise
tblemperformance.CommissionRaise
,并相应更新
tblEmployee

tblemperformance

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 
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
如果未找到匹配的
EmpID
,请查看
tblContractorPerformance

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 
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
更新: 啊!!。。 编写此SQL查询的最佳方法是什么。存储过程还是游标?
任何关于如何设计查询的建议都会非常有帮助

请避免使用游标。在处理您的数据时,基于思维集。因此,在第一组数据上执行,其中
tblemperformance.Salary>0
。执行更新,然后对下一组数据执行第二个操作,其中
tblemperformance.Commission>0
。最后,更新
tblContractorPerformance.Salary>0
中的所有数据


将这些操作放在存储过程中,我相信您将看到比使用游标的等效操作更好的性能。

请避免使用游标。在处理您的数据时,基于思维集。因此,在第一组数据上执行,其中
tblemperformance.Salary>0
。执行更新,然后对下一组数据执行第二个操作,其中
tblemperformance.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

据我所知,您可以将其封装到单个查询中:

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

但是,问题到底是什么?我今天很胖,但是,到底是什么问题?我今天很胖>[谢谢你谢谢你谢谢你!!!!!!!!!!这是我的建议,但被上层管理层否决了。“谢谢”是对验证我的解决方案表示感谢。:-)哈哈。我有一些轶事证据——有大量基于游标的存储过程。他们花了几个小时才跑完。我根据集合重写了它们,总共花了大约30秒。出于某种原因,查询处理的时间越长,客户越觉得“这是他们为我们做的复杂事情……他们值得每小时250美元的费用”。总之,得到了上层管理层的认可。大家开心!!:-)是的,250美元/小时的顾问编写了光标代码,然后我作为25美元/小时的程序员重新编写了代码,以便正确运行。谢谢谢谢!!!!!!!!!!这是我的建议,但被上层管理层否决了。“谢谢”是对验证我的解决方案表示感谢。:-)哈哈。我有一些轶事证据——有大量基于游标的存储过程。他们花了几个小时才跑完。我根据集合重写了它们,总共花了大约30秒。出于某种原因,查询处理的时间越长,客户越觉得“这是他们为我们做的复杂事情……他们值得每小时250美元的费用”。总之,得到了上层管理层的认可。大家开心!!:-)是的,250美元/小时的顾问编写了光标代码,然后我作为25美元/小时的员工程序员来了,必须重写代码才能正确运行。