/ / Application croisée SQL - est-il nécessaire - la raison pour laquelle il est utilisé dans cet exemple n'est pas claire - SQL, serveur SQL, application croisée

SQL Cross Apply - est-il nécessaire - ne sait pas pourquoi il est utilisé dans cet exemple - sql, sql-server, cross-apply

Je travaille sur une procédure stockée dont j'ai héritéet il y a quelques requêtes Cross use (voir requêtes ci-dessous). J'ai un développeur SQL expérimenté, mais pas tellement pour les applications croisées, il peut donc y avoir une explication simple qui me manque.

Ma question est pour ces 2 requêtes il ressemble àla croix applique est juste de faire un appel de fonction et / ou logique pour créer une colonne, et je pourrais simplement le faire dans la sélection et supprimer complètement la croix Si vous pouviez expliquer en quelque sorte pourquoi je l'apprécierais également.

Quand j'ai vu Cross Apply utilisé il y atoujours eu quelque chose DANS la croix qui s’appliquait essentiellement aux tables en dehors de la croix. Quelque chose comme ceci par exemple serait dans la croix, appliquer pour "joindre" les tables FROM aux tables de la croix, appliquer: soh.SalesOrderID (table outside corss) = sod.SalesOrderID (table dans la croix)

Je ne vois rien de tel dans les deux requêtes ci-dessous ou une raison pour cela.

        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

Je vous remercie.

Réponses:

2 pour la réponse № 1

Dans la première requête, vous pouvez utiliser une sous-requête. Cependant, notez que la variable PEMWeightByClientAge.PEMWeight dans le CROSS APPLY est utilisé deux fois dans le SELECT. Cela donne une idée de la raison pour laquelle l'écriture a choisi CROSS APPLY.

Pourquoi utilisez-vous CROSS APPLY? Il existe plusieurs raisons. Le plus fondamental consiste à appeler une fonction renvoyant des ensembles sur les arguments d'une table. Il n'y a vraiment pas d'autre moyen de le faire.

Avec une sous-requête, APPLY est plus général que joint. Il peut aussi optimiser mieux. Si vous n’êtes pas à l’aise avec le serveur spécifique à SQL APPLY, réalisez simplement que ce sont des jointures latérales et assez cohérentes avec les autres opérations de base de données.

Vous avez un troisième cas d'utilisation. Cela contourne le fait que les alias de colonnes ne peuvent pas être réutilisés dans un fichier. SELECT. Les sous-requêtes et les CTE sont des alternatives. Les sous-requêtes ont l'inconvénient (si elles sont correctement mises en retrait), l'imbrication peut laisser beaucoup d'espace blanc à gauche. Les CTE sont une alternative viable. Ce que quelqu'un utilise est vraiment une question de goût, plutôt que d'avoir "raison" ou "tort".