我有以下表格:
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表中有记录的员工,而不是整个员工列表。我该如何解决这个问题?
答案 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