表连接未返回准确的结果;任何想法为什么?

时间:2012-11-26 16:50:09

标签: sql sql-server sql-server-2008 sql-server-2005

每年,我们的部门都会征求员工的意见,以帮助支持癌症研究,药物和酒精等方面的研究。

我们已经建立了一个系统来帮助减轻员工的压力。

目前,我们目前拥有与此问题相关的表格。

他们是emp,dept和贡献表。

Emp表包含我们组织中所有员工的列表。

部门表包含部门列表。

最后,每次员工捐款时,员工的ID和捐款日期(date_stamp)都会记录在捐款表中。

每位员工必需填写此表格,无论他/她是否正在捐款。员工可以选择捐款,或选中“我此时不想捐款”的方框

我的任务是提供一份尚未填写表格的员工名单。

如果employeeID在emp表上但在当前年份的贡献表(date_stamp)上没有,则该员工尚未填写表单。

到目前为止,我的查询在emp表上返回的员工不到一半,但尚未完成表单。我们希望此代码返回emp表中那些尚未列入当前年度贡献表的员工列表。

目前,由于贡献季节从2012年11月27日开始,我们希望此查询返回emp表上的所有员工。

非常感谢您的协助。

SELECT  e.lastname, e.firstname,CASE active WHEN 1 then 'Yes'WHEN 0 then 'No' else 'other'END
FROM contributions c
LEFT JOIN emp e ON e.employee_id = c.employee_id
INNER JOIN dept d ON d.dept_code = e.dept_code
WHERE Year(c.date_stamp) <> '2010' OR Year(c.date_Stamp) <> '2011' OR Year(c.date_Stamp) <> '2012'
GROUP BY e.lastname,e.firstname, e.employee_id, active
ORDER By e.lastname;

2 个答案:

答案 0 :(得分:5)

如果我理解正确,你需要这样的东西

select
    e.lastname, e.firstname
from emp as e
where
    e.employee_id not in
    (
         select c.employee_id
         from contributions as c
         where c.date_stamp >= convert(datetime, '20121127', 112)
    )

答案 1 :(得分:0)

尝试使用EXISTS

选择e.lastname,e.firstname,CASE激活WHEN 1然后'Yes'WHEN 0然后'否'其他'其他'END 来自emp e,dept d 其中d.dept_code = e.dept_code 并且不存在(从c.employee_id = e.employee_id的贡献中选择'x')

希望有所帮助。