2014-04-03 34 views
0

我有一個存儲過程在我的表中查找數據,名爲csScheduleAgents。當您第一次點擊該頁面時,它會抓取您的用戶ID並檢查該表以獲取信息。它將所有記錄加入員工表。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]已存在,它甚至不會從empTable中獲取數據,就像我想要的 – SBB

回答

2

您可以使用RIGHT JOIN而不是INNER JOIN,並且還設置WHERE條款使用[empID]empTable表過濾記錄。

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

我試過這個,但它在數據上返回NULL時A. [empID]在csScheduleAgents中找不到 – SBB

+0

我很困惑然後。這不是你想要的嗎?你說:「即使沒有A. [empID]的記錄,我怎麼能使這個聲明有效......」 –

+1

@SBB - 嗯,是的......如果你有'WHERE a。[empID] = @ empID'但沒有記錄匹配,那麼你得不到結果...嘗試在僱員表上過濾,而不是我認爲僱員*必須*存在? 'WHERE b。[empID] = @ empID'。 – MatBailie

0

你會想要一個RIGHT JOIN

RIGHT JOIN關鍵字返回右表(table2), 中的所有行以及左表(table1)中的匹配行。當沒有匹配時,結果爲NULL 。