即使为null,TSQL也包含数据

时间:2014-04-03 13:45:20

标签: sql tsql

我有一个存储过程正在我的表中查找名为csScheduleAgents的数据。当您第一次点击该页面时,它会抓取您的userID并检查该表以获取信息。它正在将employee表与所有记录一起加入。

我遇到的问题是,如果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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

你需要一个RIGHT JOIN

  

RIGHT JOIN关键字返回右表(table2)中的所有行,   使用左表(table1)中的匹配行。结果为NULL   在没有匹配的情况下在左侧。