2016-10-20 3 views
0

상속 된 저장 프로 시저에서 작업 중이며 일부 크로스 적용 쿼리 (아래 쿼리 참조)가 있습니다. 나는 경험 많은 SQL 개발자를 보유하고 있지만 십자가 신청서는 그리 많지 않으므로 여기서 간단히 설명 할 수 있습니다.SQL 교차 적용 - 필요합니다 -이 예제에서 사용 된 이유에 대해 명확하지 않습니다.

내 질문은 교차 적용 그냥 열을 만들려면 함수 호출 및/또는 논리를 수행하는 것처럼 보이는 이러한 두 쿼리에 대한 및 선택 및 크로스 적용 완전히 제거 할 수 있습니다. 내가 왜 그것을 고맙게 생각하는지에 관해서는 당신이 어떤 종류의 설명을 할 수 있다면.

크로스 적용을 사용했을 때 본질적으로 십자가 적용 범위 밖의 테이블에 조인 할 십자가 적용 항목이있었습니다. 예를 들어 이런 식으로 십자가 내부에있을 수 있습니다 교차 테이블에 테이블에 "조인"크로스 테이블에 적용 할 : 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에서 두 번 사용됩니다. 이것은 왜 쓰기가 CROSS APPLY을 선택했는지에 대한 힌트를 제공합니다.

CROSS APPLY을 사용합니까? 몇 가지 이유가 있습니다. 가장 기본적인 것은 테이블의 인수에 대해 집합 반환 함수를 호출하는 것입니다. 다른 방법은 없습니다.

하위 쿼리의 경우 APPLY이 조인보다 더 일반적입니다. 또한 최적화가 더 잘됩니다. SQL-Server-specific APPLY에 대해 불편한 점이 있다면, 이들이 외부 조인이고 다른 데이터베이스 작업과 상당히 일치한다는 것을 알기 바란다.

세 번째 유스 케이스가 있습니다. 이는 SELECT에서 열 별칭을 다시 사용할 수 없다는 사실을 나타냅니다. 서브 쿼리와 CTE는 대안입니다. 서브 쿼리는 (적절하게 들여 쓰기가되면) 중첩이 왼쪽에 많은 공백을 남길 수 있다는 단점이 있습니다. CTE는 실행 가능한 대안입니다. 누군가가 사용하는 것은 정말로 "옳다"또는 "잘못"이 아니라 취향의 문제입니다.