2016-10-20 3 views
0

私は継承したストアドプロシージャを作成していますが、いくつかのクロス適用クエリがあります(以下のクエリを参照)。私は経験豊富なSQL開発者を抱えていますが、クロス・アプリケーションにはあまり適していません。SQL Cross Apply - この例でなぜ使用されているのか明確ではありません

私の質問は、これらの2つのクエリのクロス適用は、単に関数呼び出しやロジックを作成して列を作成することです。選択とクロス適用を完全に削除するだけです。どうして私がそれに感謝するのかについて何らかの説明をすることができれば。

クロス・アプライが使用されているのを見ると、クロス・アプリケーションの中には、十字適用外の表に本質的に結合するものがあります。例えば、このようなものは、十字架の内側にあり、FROMテーブルをクロス・アプリケーションのテーブルに「結合」するために適用されます:soh.SalesOrderID(クロス・テーブルの外側のテーブル)= 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

私の意見では、あなたは完全に正しいです。それはちょっと厄介な構文です。私がスクリプトを書いていたら、それを関数にするか、selectステートメントにインクルードします。しかし、すでにリファクタリングしていても、リファクタリングするのは難しいでしょうか? –

答えて

2

最初のクエリでは、サブクエリを使用できます。ただし、CROSS APPLYの変数PEMWeightByClientAge.PEMWeightSELECTでは2回使用されています。これはなぜ書き込みがCROSS APPLYを選択したかのヒントを与える。

なぜCROSS APPLYを使用しますか?いくつかの理由があります。最も基本的なのは、テーブルからの引数に対してset-returning関数を呼び出すことです。実際にそれを行う方法は他にありません。

サブクエリでは、APPLYが結合よりも一般的です。また、より良い最適化も可能です。 SQLサーバー固有のAPPLYに不快な場合は、これらが横結合であり、他のデータベース操作と非常に一致していることだけを認識してください。

3番目のユースケースがあります。これは、列エイリアスがSELECTで再利用できないという事実を回避します。サブクエリとCTEは選択肢です。サブクエリには、(適切にインデントされていれば)ネストが左に多くの空白を残すという欠点があります。 CTEは実行可能な代替手段です。誰かが使っているのは本当に「正しい」か「間違っている」というのではなく、味覚の問題です。

関連する問題