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

SQL Cross Apply - is it needed - not clear on why it is being used in this example

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

我的问题是对于这 2 个查询,交叉应用看起来只是在执行函数调用 and/or 逻辑来创建列,我可以在 select 中执行此操作并删除十字架完全适用。如果你能解释一下为什么我也会很感激。

当我看到使用交叉应用时,交叉应用中总会有一些东西本质上会连接到交叉应用之外的 tables。例如,像这样的东西会在交叉应用到 "join" 的内部,从 tables 到交叉应用中的 tables:soh.SalesOrderID(table 外部corss) = sod.SalesOrderID (table inside cross)

我在以下 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   

谢谢。

在第一个查询中,您可以使用子查询。但是,请注意 CROSS APPLY 中的变量 PEMWeightByClientAge.PEMWeightSELECT 中被使用了两次。这暗示了为什么写入选择 CROSS APPLY.

为什么使用CROSS APPLY?有几个原因。最基本的是对来自 table 的参数调用集合返回函数。确实没有其他方法可以做到这一点。

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

您有第三个用例。这解决了不能在 SELECT 中重复使用列别名的事实。子查询和 CTE 是备选方案。子查询的缺点是(如果正确缩进),嵌套可以在左侧留下很多白色 space。 CTE 是一个可行的替代方案。某人使用哪个真的是品味问题,而不是 "right" 或 "wrong".