2014-04-03 3 views
0

csScheduleAgents이라는 테이블의 데이터를 찾고있는 저장 프로 시저가 있습니다. 페이지를 처음 조회하면 사용자 ID를 획득하고 해당 테이블에서 정보를 확인합니다. 모든 레코드가있는 직원 테이블에 참여 중입니다.null이더라도 TSQL에 데이터가 포함됩니다

내가 겪고있는 문제는 A.[empID]가 존재하지 않는다면 데이터를 가져 오지 못합니다. B.[]; 그래서 조인은 실패합니다.

A.[empID]에 대한 레코드가 변수로 전달 되어도이 명령문이 작동하도록하려면 어떻게해야합니까?

SELECT A.[id], 
    A.[empID], 
    A.[shiftPref], 
    CONVERT (VARCHAR (20), A.[lastUpdated], 101) AS lastUpdated, 
    B.[firstName], 
    B.[lastName], 
    B.[SupEmpID], 
    B.[DepartmentDesc] + ' ' + B.[SkillSetDesc] as SkillSetDesc, 
    C.[firstName] + ' ' + C.[lastName] AS supervisor 
FROM csScheduleAgents AS A 
    INNER JOIN 
    empTable AS B 
    ON B.[empID] = A.[empID] 
    INNER JOIN 
    empTable AS C 
    ON C.[empID] = B.[SupEmpID] 
WHERE A.[empID] = @empID 
FOR XML PATH ('details'), TYPE, ELEMENTS, ROOT ('root'); 
END 
+0

A.empID가없는 경우 어떤 데이터를 반환 하시겠습니까? –

+0

데이터는 상관없이 employee 테이블 (empTable)에 있습니다. 그 이유는 A. [empID] doenst가 존재하기 때문에, empTable에서 데이터를 가져 오는 것조차 원하지 않습니다. – SBB

답변

2

당신은 대신 INNER JOINRIGHT JOIN을 사용하고, 또한 empTable 테이블에서 [empID]를 사용하여 레코드를 필터링 할 수 WHERE 절을 설정할 수 있습니다.

SELECT A.[id], 
      A.[empID], 
      A.[shiftPref], 
      CONVERT (VARCHAR (20), A.[lastUpdated], 101) AS lastUpdated, 
      B.[firstName], 
      B.[lastName], 
      B.[SupEmpID], 
      B.[DepartmentDesc] + ' ' + B.[SkillSetDesc] as SkillSetDesc, 
      C.[firstName] + ' ' + C.[lastName] AS supervisor 
    FROM csScheduleAgents AS A 
      RIGHT JOIN 
      empTable AS B 
      ON B.[empID] = A.[empID] 
      RIGHT JOIN 
      empTable AS C 
      ON C.[empID] = B.[SupEmpID] 
    WHERE B.[empID] = @empID 
    FOR XML PATH ('details'), TYPE, ELEMENTS, ROOT ('root'); 
END 

이 왼쪽이 NULL 경우에도 오른쪽 측면에서 모든 레코드를 반환합니다.

+0

이걸 시도했지만 A. [empID]가 csScheduleAgents에서 발견되지 않았을 때 NULL을 반환했습니다 – SBB

+0

저는 혼란 스럽습니다. 그때. 그게 네가 원하는거야? 당신은 "A [empID]에 대한 기록이 없어도이 성명서를 어떻게 작동시킬 수 있습니까?"라고 말했습니다. –

+1

@SBB - 음, 네 ... 만약 당신이'[empID] = @ empID' 하지만 일치하는 레코드가 없다면 아무런 결과도 얻지 못할 것입니다. 직원 테이블에 필터링을 시도해보십시오. 직원이 반드시 존재해야한다고 가정합니다. '어디에서 b. [empID] = @ empID'. – MatBailie

0

당신은 RIGHT JOIN을 원할 것입니다.

권리는 키워드 반환에게 올바른 테이블 (표 2), 왼쪽 테이블 (표)에 일치하는 행 의 모든 행 가입하세요. 결과가 일치하지 않을 경우 왼쪽에 NULL입니다.

관련 문제