2014-09-04 5 views
0

큰 저장 프로 시저로 작업하고 있는데, 일부만 문제가 있습니다.SQL - OutterApply 및 Left Join

im 결합 테이블에 대해 쿼리를 실행하면 0, 1 또는 2 개의 결과가있을 수 있습니다. 0 개의 결과가 있다면, 나는 상관하지 않는다. 내 코드는 null 값을 리턴한다. 결과가 1 개인 경우 올바른 값을 반환하지만 결과가 2 개인 경우 두 번째 결과를 선택하는 데 문제가 있습니다.

아래 코드는 두 번째 OutterApply (AHM2 항목)까지 작동합니다. 누구든지 내가 뭘 잘못하고 있는지 알아?

동물 ID는 두 가지 OuterApply에 대해 동일합니다. 두 번째 결과가있는 경우 첫 번째 결과와 동일하지 않은 경우 두 번째 결과 만 반환하면됩니다.

SELECT TOP 1 
     AHM.AnimalHerdManagementId, 
     AHM.HerdManagementId, 
     AHM2.AnimalHerdManagementId, 
     AHM2.HerdManagementId, 
     HM.Code AS HerdManagementCode, 
     HM2.Code AS HerdManagementCode2 
OUTER APPLY 
     (
      SELECT TOP 1 AHM.AnimalHerdManagementId, AHM.HerdManagementId 
      FROM dbo.AnimalHerdManagement AHM 
      WHERE AHM.AnimalId = A.AnimalId AND ISNULL(AHM.EffectiveFrom, @EffectiveFrom) <= @EffectiveFrom 
      ORDER BY AHM.EffectiveFrom DESC 
     ) AHM 
     LEFT JOIN dbo.HerdManagement HM ON AHM.HerdManagementId = HM.HerdManagementId 
     OUTER APPLY 
     (
      SELECT TOP 1 AHM2.AnimalHerdManagementId, AHM2.HerdManagementId 
      FROM dbo.AnimalHerdManagement AHM2 
      WHERE AHM2.AnimalId = A.AnimalId AND AHM2.AnimalHerdManagementId != AHM.AnimalHerdManagementId AND ISNULL(AHM2.EffectiveFrom, @EffectiveFrom) <= @EffectiveFrom 
      ORDER BY AHM2.EffectiveFrom DESC 
     ) AHM2 
LEFT JOIN dbo.HerdManagement HM2 ON AHM2.HerdManagementId = HM2.HerdManagementId 
+0

난 그렇게 내 첫 번째 노력은 그들에게 하나의 행에 박제 반환하려고 노력하는 대신 두 개의 행을 반환하는 것, 조금 게으른입니다. 열을 행으로 바꾸는 것이 PITA라는 것은 제 경험이었습니다. 그럴 가능성이 있니? – KingOfAllTrades

+0

불행히도. 나는 단지 기존 sp를 수정하고있다. 그리고이 열을 추가하십시오. 정말 그것을 바꿀 수 있습니다. 많은 것에 달려 있습니다. – Mark

+1

나는 많은 것을 알았다. 그렇지 않으면 아마 이런 식으로하지 않을 것이다. 그러나 나는 조금 게으른 사실을 서언 했었습니다 ... 당신이 얻고있는 결과를 게시 할 수 있습니까? – KingOfAllTrades

답변

1

나는 내가 OUTER APPLY하지만 두 개의 서로 다른 값을 얻을 수있는 방법은 내 솔루션은 전체 해킹으로 도움이 필요 할 것입니다 당신을 도울 수 있다고 생각합니다.

먼저 외부 신청에 가입 할 필요가 없습니다. 조인이 함축되어 있습니다. 따라서 쿼리에서 조인 구문을 완전히 제거 할 수 있습니다.

둘째, AnimalHerdManagement는 Junction Table이라는 특수한 테이블처럼 보입니다. 여기에 포함 된 모든 데이터는 다른 곳에 포함됩니다 (완전히 중복 된 데이터가 포함되어 특수 테이블이라고 불리는 이유입니다). 그러나 그것은 사소한 것입니다.

마지막으로 내가 던진 몇 가지 예제 코드는 여러분이 수행 한 것을 완성합니다. 두 가지 외부 적용에서 다른 결과를 검색하는 데 사용하는 방법은 해킹이지만, 항상 사실 일 것이라고 확신하는 경우 작동 할 수 있습니다. 다중 레벨 외부 적용을받을 수 없습니다.

select * from AH_Animal A 
outer apply 
(
    select max (HerdManagementID) as HerdMgmtID1 from AH_AnimalHerdManagement HM1 where HM1.AnimalID = A.AnimalID 
) as z 
outer apply 
(
    select min (HerdManagementID) as HerdMgmtID2 from AH_AnimalHerdManagement HM2 where HM2.AnimalID = A.AnimalID 
) as zz 

도움이 되었기를 바랍니다. 당신이 3 가지 결과를 기대한다면 전혀 효과가 없으므로 다른 해결책이 있어야합니다.

쿼리 결과 :

Query Results

+0

세 번째 결과가 발생할 가능성을 방지하는 비즈니스 규칙이 있습니다. 고맙습니다.. – Mark