SQL Cross Apply - 是否需要 - 不清楚为什么在这个例子中使用它

时间:2016-10-20 15:24:15

标签: sql sql-server cross-apply

我正在处理我继承的存储过程,它有一些Cross应用查询(请参阅下面的查询)。我有一个经验丰富的SQL开发人员,但没有那么多交叉应用所以可能有一些简单的解释,我在这里只是缺少。

我的问题是这两个查询看起来交叉应用只是做一个函数调用和/或逻辑来创建一个列,我可以在选择中完成,并完全删除交叉应用。如果你可以给出一些解释,为什么我也会欣赏它。

当我看到使用Cross Apply时,在交叉应用中始终存在一些基本上连接到交叉应用之外的表的东西。例如,这样的东西将在十字架内适用于"加入" FROM表到十字架中的表适用:soh.SalesOrderID(corss之外的表)= sod.SalesOrderID(表内交叉)

我在下面的2个查询中没有看到类似的内容或原因。

        SELECT 
            LeadInventory.LoanNumber, 
            'Client Age',
            PEMWeightByClientAge.PEMWeight,
            LeadInventory.ClientAge,
            PEMWeightByClientAge.PEMWeight,
             #LoanPEMModelHybrid.PEMModel 
        FROM LeadInventory  
        INNER JOIN #LoanPEMModelHybrid ON dbo.LeadInventory.LoanNumber = #LoanPEMModelHybrid.LoanNumber 
        CROSS APPLY 
        (
            SELECT PEMWeight =
            CASE 
                WHEN LeadInventory.ClientAge<=70 AND LeadInventory.ClientAge>=62 Then @PEMWeightAge62To70
                WHEN LeadInventory.ClientAge<80 AND LeadInventory.ClientAge>70 THEN @PEMWeightAge71To80
                WHEN LeadInventory.ClientAge>=80 THEN @PEMWeightAge80Plus
            ELSE 0
            END
        ) AS  PEMWeightByClientAge     
        WHERE #LoanPEMModelHybrid.PEMModel = 'Application' 
        AND LeadInventory.ClientAge>0





SELECT  DISTINCT 
        IDENTITY(INT, 1,1) AS ID,
        LoanNumber,
        Calculation.Prob AS TotalPEMScoreForLoan,
        PEMModelCode
INTO #PEMScoreHybridFinal
FROM #PEMScoreHybrid    
CROSS APPLY
( 
  SELECT Prob  = 
  CASE PEMModelCode
       WHEN 'Initial QQ' THEN CAST (EXP(@INITIALQQBASE+ TotalPEMScoreForLoan)/(EXP(@INITIALQQBASE+TotalPEMScoreForLoan)+1)*100 AS Decimal(9,2)) 
       WHEN 'APPLICATION' THEN CAST (EXP(@APPLICATIONBASE+ TotalPEMScoreForLoan)/(EXP(@APPLICATIONBASE+TotalPEMScoreForLoan)+1)*100 AS Decimal(9,2)) 
       END
) Calculation   

谢谢。

1 个答案:

答案 0 :(得分:2)

在第一个查询中,您可以使用子查询。但请注意,PEMWeightByClientAge.PEMWeight中的变量CROSS APPLYSELECT中使用了两次。这给出了一个提示,说明为什么写选择CROSS APPLY

为什么使用CROSS APPLY?有几个原因。最基本的是对表中的参数调用set-returns函数。没有其他任何方法可以做到这一点。

使用子查询,APPLY比连接更通用。它还可以更好地优化。如果您对SQL-Server特定的APPLY感到不舒服,只需要意识到这些是横向连接并且与其他数据库操作非常一致。

你有第三个用例。这解决了无法在SELECT中重用列别名的事实。子查询和CTE是替代方案。子查询的缺点是(如果正确缩进),嵌套可能会在左侧留下大量空白区域。 CTE是一种可行的替代方案。有人使用的确是一个品味问题,而不是&#34;对&#34;或&#34;错误&#34;。