2017-09-26 86 views
0

我需要编写一个查询,以仅查找缺少进入我们ERP系统的学位的员工。例如,我们有一张表列出他们的学位。如何根据同一列中的多个值过滤SQL查询

Employee ID FName LName Degree 
100   John Smith BA 
200   Bill Jones BS 
300   Alice Waters BA 
300   Alice Waters MA 
400   Joe Lewis MA 

他们希望我从这个表中,只有乔·刘易斯拔,因为他没有在系统中输入的学士学位,但因为他拥有硕士学位,假设他也有大学本科,有人只是错过了进入系统。

我使用除非学士学位过滤然而试过,仍然得到

Employee ID FName LName Degree 
300   Alice Waters MA 
400   Joe Lewis MA 

而且我不希望爱丽丝在列表中,因为她有一个学士学位编码到系统中。

任何想法如何我可能会接近这一点将不胜感激。

+0

提示:找到所有拥有主人的人,然后用Bachelors减去那些人......剩下的人是感兴趣的人。 – Randy

+1

你应该为你的问题添加你的尝试代码。 – svgrafov

+0

单身汉是学士学位还是文学学士,不是吗?提示:使用合适的软件(MySQL,Oracle,DB2,...)和版本(例如, '的SQL服务器2014'。语法和功能的差异往往会影响答案。请注意,'tsql'缩小了选择范围,但不指定数据库。 – HABO

回答

2

如果这仅仅是MA和BA,你可以使用条件汇总:

select empid, fname, lname 
from t 
group by empid, fname, lname 
having sum(case when degree = 'BA' then 1 else 0 end) = 0 and 
     sum(case when degree = 'MA' then 1 else 0 end) > 0; 

或者,你可以使用exists

select t.* 
from t 
where degree = 'MA' and 
     not exists (select 1 
        from t t2 
        where t2.empid = t.empid and t2.degree = 'BA' 
       ); 
+0

存在的建议就像一个魅力!非常感谢大家的帮助! – noonch

1

你可以用左手去参加大师子集反对Bachelors子集:

select m.EmployeeId, m.FName, m.LName 
from  (select * from Employee where Degree in ('MA')) m 
left join (select * from Employee where Degree in ('BA', 'BS')) b 
on m.EmployeeId = b.EmployeeId 
where b.EmployeeId is null 
0

也许你应该考虑使用查询没有子查询......

SELECT E.EmployeeId, E.FName, E.LName 
FROM Employee AS E 
LEFT JOIN Employee AS F ON (E.EmployeeId = F.EmployeeId AND F.Degree = 'BA') 
WHERE E.Degree <> 'BA' AND F.EmployeeId IS NULL 

或(如BS必须考虑为好):

SELECT E.EmployeeId, E.FName, E.LName 
FROM Employee AS E 
LEFT JOIN Employee AS F ON (E.EmployeeId = F.EmployeeId AND F.Degree IN('BA','BS')) 
WHERE E.Degree <> 'BA' AND E.Degree <> 'BS' AND F.EmployeeId IS NULL 

牢记子查询往往是缓慢的,这取决于排多少关注...

相关问题