/ / SQL Cross Apply - es necesario - no está claro por qué se usa en este ejemplo - sql, sql-server, cross-apply

SQL Cross Apply - es necesario - no está claro por qué se está utilizando en este ejemplo - sql, sql-server, cross-apply

Estoy trabajando en un procedimiento almacenado que heredé.y tiene algunas consultas de aplicación cruzada (consulte las consultas a continuación). Tengo un desarrollador de SQL con experiencia, pero no tanto para la aplicación cruzada, por lo que puede haber una explicación simple.

Mi pregunta es para estas 2 consultas parecela aplicación cruzada es solo hacer una llamada a la función y / o lógica para crear una columna, y podría hacer eso en la selección y eliminar la aplicación cruzada por completo. Si pudiera dar algún tipo de explicación sobre por qué lo apreciaría también.

Cuando he visto usar Cross Apply allí tienesiempre ha habido algo EN la aplicación cruzada que esencialmente se uniría a las tablas fuera de la aplicación cruzada. Algo como esto, por ejemplo, estaría dentro de la cruz, se aplica a "unir" las tablas FROM a las tablas que se encuentran en la cruz: soh.SalesOrderID (tabla fuera de corss) = sod.SalesOrderID (tabla dentro de la cruz)

No veo nada de eso en las siguientes 2 consultas o una razón para ello.

        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

Gracias.

Respuestas

2 para la respuesta № 1

En la primera consulta, puede utilizar una subconsulta. Sin embargo, tenga en cuenta que la variable PEMWeightByClientAge.PEMWeight en el CROSS APPLY se está utilizando dos veces en el SELECT. Esto da una pista de por qué la escritura eligió CROSS APPLY.

Porque usas CROSS APPLY? Hay varias razones. Lo más básico es llamar a una función de retorno de conjunto en los argumentos de una tabla. Realmente no hay otra forma de hacerlo.

Con una subconsulta, APPLY Es más general que las uniones. También puede optimizar mejor. Si no está cómodo con el servidor SQL específico APPLY, tenga en cuenta que se trata de uniones laterales y bastante coherentes con otras operaciones de base de datos.

Tienes un tercer caso de uso. Esto evita el hecho de que los alias de columna no se pueden reutilizar en una SELECT. Las subconsultas y CTEs son alternativas. Las subconsultas tienen la desventaja de que (si están correctamente sangradas), el anidamiento puede dejar muchos espacios en blanco a la izquierda. Los CTE son una alternativa viable. Lo que alguien usa es realmente una cuestión de gusto, en lugar de ser "correcto" o "incorrecto".