我正在处理我继承的存储过程,它有一些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
谢谢。
答案 0 :(得分:2)
在第一个查询中,您可以使用子查询。但请注意,PEMWeightByClientAge.PEMWeight
中的变量CROSS APPLY
在SELECT
中使用了两次。这给出了一个提示,说明为什么写选择CROSS APPLY
。
为什么使用CROSS APPLY
?有几个原因。最基本的是对表中的参数调用set-returns函数。没有其他任何方法可以做到这一点。
使用子查询,APPLY
比连接更通用。它还可以更好地优化。如果您对SQL-Server特定的APPLY
感到不舒服,只需要意识到这些是横向连接并且与其他数据库操作非常一致。
你有第三个用例。这解决了无法在SELECT
中重用列别名的事实。子查询和CTE是替代方案。子查询的缺点是(如果正确缩进),嵌套可能会在左侧留下大量空白区域。 CTE是一种可行的替代方案。有人使用的确是一个品味问题,而不是&#34;对&#34;或&#34;错误&#34;。