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.PEMWeight
在 SELECT
中被使用了两次。这暗示了为什么写入选择 CROSS APPLY
.
为什么使用CROSS APPLY
?有几个原因。最基本的是对来自 table 的参数调用集合返回函数。确实没有其他方法可以做到这一点。
对于子查询,APPLY
比连接更通用。它还可以更好地优化。如果您对SQL-特定于服务器的 APPLY
不满意table,只需意识到这些是横向连接并且与其他数据库操作非常一致。
您有第三个用例。这解决了不能在 SELECT
中重复使用列别名的事实。子查询和 CTE 是备选方案。子查询的缺点是(如果正确缩进),嵌套可以在左侧留下很多白色 space。 CTE 是一个可行的替代方案。某人使用哪个真的是品味问题,而不是 "right" 或 "wrong".
我正在处理我继承的存储过程,它有一些交叉应用查询(请参阅下面的查询)。我有一位经验丰富的 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.PEMWeight
在 SELECT
中被使用了两次。这暗示了为什么写入选择 CROSS APPLY
.
为什么使用CROSS APPLY
?有几个原因。最基本的是对来自 table 的参数调用集合返回函数。确实没有其他方法可以做到这一点。
对于子查询,APPLY
比连接更通用。它还可以更好地优化。如果您对SQL-特定于服务器的 APPLY
不满意table,只需意识到这些是横向连接并且与其他数据库操作非常一致。
您有第三个用例。这解决了不能在 SELECT
中重复使用列别名的事实。子查询和 CTE 是备选方案。子查询的缺点是(如果正确缩进),嵌套可以在左侧留下很多白色 space。 CTE 是一个可行的替代方案。某人使用哪个真的是品味问题,而不是 "right" 或 "wrong".