SQL - 如何使用连接显示所有数据?

时间:2018-03-17 13:58:49

标签: sql-server join left-join

我有以下表格:

Table "Staff"
StaffID
StaffName

Table "AssignedStaff"
StaffID
EventID

Table "Events"
EventID
Date

我想显示所有工作人员的详细信息,但与具有指定日期值的事件关联的人员除外。我尝试过以下方法:

SELECT Staff.StaffID, StaffName FROM Staff 
LEFT JOIN AssignedStaff ON Staff.StaffID = AssignedStaff.StaffID 
INNER JOIN Events ON AssignedStaff.EventID = Events.EventID 
WHERE NOT Date='xxx'

但这只选择在AssignedStaff表中有记录的员工,而不是整个员工列表。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

  

我想显示所有工作人员的详细信息,但与具有指定日期值的事件关联的人员除外。

一直使用LEFT JOIN,然后检查不匹配。关键是将日期条件移动到ON子句:

SELECT s.StaffID, s.StaffName
FROM Staff s LEFT JOIN
     AssignedStaff ast
     ON s.StaffID = ast.StaffID LEFT JOIN
     Events e
     ON ast.EventID = e.EventID AND e.DATE = ?
WHERE e.EventID IS NULL;

注意:这会删除该日期的所有事件,因此您可能需要更多条件来指定确切事件。

答案 1 :(得分:0)

这应该有效

SELECT Staff.StaffID, StaffName 
 FROM Staff 
 LEFT JOIN AssignedStaff 
   ON Staff.StaffID = AssignedStaff.StaffID 
 LEFT JOIN Events 
   ON AssignedStaff.EventID = Events.EventID 
  AND Date <> 'yyyy.mm.dd'

你可能正在寻找这个

SELECT Staff.StaffID, StaffName 
FROM Staff 
where not exists ( select 1 
                     from AssignedStaff 
                     JOIN Events 
                       ON AssignedStaff.EventID = Events.EventID 
                      AND Date = 'yyyy.mm.dd'
                    where Staff.StaffID = AssignedStaff.StaffID 
                 )

答案 2 :(得分:-1)

   SELECT * from Staff, AssignedStaff, Events 
where Staff.StaffID = AssignedStaff.StaffID
And AssignedStaff.EventID = Events.EvebtID
And Events.Data <> XXX