/ / SQL Cross Apply - je to potrebné - nie je jasné, prečo sa používa v tomto príklade - sql, sql-server, cross-apply

SQL Cross Apply - je potrebné - nie je jasné, prečo sa používa v tomto príklade - sql, sql-server, cross-apply

Pracujem na uloženej procedúre, ktorú som zdedila má nejaké krížové dopyty (pozri dopyty nižšie). Mám skúseného vývojára SQL, ale nie toľko pre krížové použitie, takže tam môže byť jednoduché vysvetlenie, ktoré tu chýba.

Moja otázka sa týka týchto dvoch dopytovkrížový aplikovať len robí volanie funkcie a / alebo logiku na vytvorenie stĺpca, a mohol by som to urobiť len vo výbere a odstrániť križiak aplikovať úplne. Ak by ste mohli dať nejaké vysvetlenie, prečo by som to tiež ocenil.

Keď som videl Cross Apply používal tamvždy bol niečo v krížovej aplikácii, ktorá by sa v podstate pripojila k tabuľkám mimo kríža. Niečo ako toto by napríklad bolo v krížovej prihláške na "pripojenie" tabuľky FROM k tabuľkám v krížovej prihláške: soh.SalesOrderID (tabuľka mimo corss) = sod.SalesOrderID (tabuľka vnútri kríža)

V nižšie uvedených 2 dopytoch nevidím nič také, ani dôvod na to.

        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

Ďakujem.

odpovede:

2 pre odpoveď č. 1

V prvom dopyte môžete použiť poddotaz. Všimnite si však, že premenná PEMWeightByClientAge.PEMWeight v CROSS APPLY sa používa dvakrát v SELECT, Toto naznačuje, prečo si písanie zvolilo CROSS APPLY.

Prečo používate CROSS APPLY? Existuje niekoľko dôvodov. Najzákladnejšou je volanie funkcie vrátenia množiny na argumenty z tabuľky. Naozaj nie je iný spôsob, ako to urobiť.

S poddotazom, APPLY je všeobecnejšia než spojenie. Môže sa tiež optimalizovať. Ak máte nepríjemné problémy so serverom SQL-Server APPLY, stačí si uvedomiť, že ide o bočné spojenia a sú úplne konzistentné s inými databázovými operáciami.

Máte tretí prípad použitia. To sa stáva okolo skutočnosti, že aliasy stĺpcov nie je možné opätovne použiť v a SELECT, Poddotazy a CTE sú alternatívy. Podriadené podiely majú nevýhodu, že (ak sú správne odsadené), hniezdenie môže ponechať veľa prázdneho miesta vľavo. CTE sú životaschopnou alternatívou. To, čo niekto používa, je naozaj záležitosťou chuti, skôr ako "správnym" alebo "zlým".