2013-01-03 2 views
0

간단한 절차를 작성하는 데 도움이 필요합니다. 제가하려고하는 것을 설명해 드리겠습니다.LEFT JOIN SQL 쿼리에 대한 도움이 필요합니다.

나는 3 개 테이블

  1. tJobOffer
  2. TApplication이
  3. tApplicationStatus이

내가 반응 후보의 수에 나에게 tJobOffer의 목록을 반환하는 프로 시저를 만들 싶습니다 이 tJobOffer에게. 응시자는 내 테이블 tApplicationStatus의 상태입니다. 이 테이블은 tJobOffer에 링크 된 tApplication에 링크됩니다.

SELECT 
     [T].[JobOfferId], 
     [T].[JobOfferTitle], 
     COUNT([A].[ApplicationId]) AS [CandidateCount] 

    FROM  [tJobOffer] AS [T] 
    LEFT JOIN [tApplication] AS [A] 
     ON  [A].[JobOfferId] = [T].[JobOfferId] 
    LEFT JOIN [tApplicationStatus] AS [S] 
     ON  [S].[ApplicationStatusId] = [A].[ApplicationStatusId] 
     AND  [S].[ApplicationStatusTechnicalName] = 'CANDIDATE' 

    GROUP BY 
      [T].[JobOfferId], 
      [T].[JobOfferTitle] 
      --[A].[ApplicationStatusId] 

    ORDER BY [T].[JobOfferTitle] 

결과는 내가 단 1을 가지고 있기 때문에

> 52ED7C67-21E1-49BB-A1F8-0601E6EED1EA Annonce 1 0 
> F26B228D-0C81-4DA8-A287-F8F997CC1F9C Annonce 1b 0 
> 9DA60B23-F113-4C7F-9707-2B90C1556D5D Announce 25 2 
> 258E11A7-79C1-47B6-8C61-413AA54E2360 Announce 3 0 
> DA582383-5DF4-4E1D-837C-382371BDEF57 Announce 6 2 

이 정확하지 않은 것입니다 : 응용 프로그램은 후보자/ACCEPTED/모름/무시한/...

내가이 쿼리를 생성 할 수 있습니다 발표 할 후보자 6. 내 회선을 설정 한 경우

--AND  [S].[ApplicationStatusTechnicalName] = 'CANDIDATE' 

의견에서 결과는 동일합니다. 내 쿼리가이 행을 무시하는 것 같습니다. 뭐가 잘못 되었 니?

편집 -

내 정확한 결과가

> 52ED7C67-21E1-49BB-A1F8-0601E6EED1EA Annonce 1 0 
> F26B228D-0C81-4DA8-A287-F8F997CC1F9C Annonce 1b 0 
> 9DA60B23-F113-4C7F-9707-2B90C1556D5D Announce 25 2 
> 258E11A7-79C1-47B6-8C61-413AA54E2360 Announce 3 0 
> DA582383-5DF4-4E1D-837C-382371BDEF57 Announce 6 1 
+2

훨씬 더 아래 시도 : D' –

+0

왜'[tApplicationStatus]으로 가입 [S]'당신이있는 경우 어디서나 사용하지 않습니까? –

답변

1

을 것 같아요 당신이 원하는 :

SELECT 
    [T].[JobOfferId], 
    [T].[JobOfferTitle], 
    COUNT([A].[ApplicationId]) AS [CandidateCount] 

FROM  [tJobOffer] AS [T] 
LEFT JOIN [tApplication] AS [A] 
    INNER JOIN [tApplicationStatus] AS [S] 
     ON  [S].[ApplicationStatusId] = [A].[ApplicationStatusId] 
     AND  [S].[ApplicationStatusTechnicalName] = 'CANDIDATE' 
    ON  [A].[JobOfferId] = [T].[JobOfferId] 

GROUP BY 
     [T].[JobOfferId], 
     [T].[JobOfferTitle] 

ORDER BY [T].[JobOfferTitle] ; 

또한 가입 할 수 먼저 2 개의 "응용 프로그램"테이블 의에 의해 그룹과는 JobOffer으로 파생 테이블을 조인

SELECT 
    [T].[JobOfferId], 
    [T].[JobOfferTitle], 
    COALESCE([G].[Cnt], 0) AS [CandidateCount] 

FROM  [tJobOffer] AS [T] 
LEFT JOIN 
      (SELECT 
        [A].[JobOfferId], 
        COUNT(*) AS [Cnt] 

       FROM  [tApplication] AS [A] 
       INNER JOIN [tApplicationStatus] AS [S] 
        ON  [S].[ApplicationStatusId] = [A].[ApplicationStatusId] 
        AND  [S].[ApplicationStatusTechnicalName] = 'CANDIDATE' 

       GROUP BY 
          [A].[JobOfferId] 
      ) AS [G] 
    ON  [G].[JobOfferId] = [T].[JobOfferId] 

ORDER BY [T].[JobOfferTitle] ; 
+0

수정하십시오. 고맙습니다. 조인에서 조인이 가능하다는 것을 알지 못했습니다. –

0

이 시도해야합니다 :

SELECT 
     [T].[JobOfferId], 
     [T].[JobOfferTitle], 
     COUNT([A].[ApplicationId]) AS [CandidateCount] 

    FROM  [tJobOffer] AS [T] 
    LEFT JOIN [tApplication] AS [A] 
     ON  [A].[JobOfferId] = [T].[JobOfferId] 
    LEFT JOIN 
     (SELECT ApplicationStatusId FROM [tApplicationStatus] 
      WHERE [ApplicationStatusTechnicalName] = 'CANDIDATE') [S] 
     ON  [S].[ApplicationStatusId] = [A].[ApplicationStatusId] 
    GROUP BY 
      [T].[JobOfferId], 
      [T].[JobOfferTitle] 
    ORDER BY [T].[JobOfferTitle] 
0

나는 확실하지 않다 당신이 요청하는 경우 두 번째 왼쪽의 ON 절 필터링 된 행이 아직 최종 결과에 표시 JOIN 이유. 그 질문 인 경우

다음 대답은 :

를 ON 술어는 행이 출력에 표시됩니다 여부를 결정하지 않습니다 즉, ON의 조건에 따라 필터는, 최종없는 경우에만 그 여부 다른 테이블의 행과 일치합니다.

반면에 WHERE 절은 최종적이며 모든 테이블 연산자가 처리 된 후 (외부 조인의 경우) 모든 외부 행이 생성 된 후 FROM 절 다음에 처리됩니다.

따라서 외부 행을 생성 한 후 필터를 적용해야하고 필터를 최종화하려면 WHERE 절에 조건자를 지정하십시오.

1

먼저 내부 조인을 사용해야만 왼쪽 조인을 사용해야합니다.당신은`당신의 질문에 원하는 결과 aling 샘플 레코드를 추가 할 수 있는지

SELECT 
    [T].[JobOfferId], 
    [T].[JobOfferTitle], 
    COUNT([A].[ApplicationId]) AS [CandidateCount] 

FROM  [tJobOffer] AS [T] 
LEFT JOIN [tApplication] AS [A] 
    INNER JOIN [tApplicationStatus] AS [S] 
     ON  [S].[ApplicationStatusId] = [A].[ApplicationStatusId] 
     AND  [S].[ApplicationStatusTechnicalName] = 'CANDIDATE' 
    ON  [A].[JobOfferId] = [T].[JobOfferId] 

GROUP BY 
     [T].[JobOfferId], 
     [T].[JobOfferTitle] 

ORDER BY [T].[JobOfferTitle] ; 
관련 문제