2013-06-13 165 views
0

为前如何获得不具有条目第二表中的记录

部门

id departmentname 
1  x 
2  y 
3  z 

员工

fkdepartmentid empname 
     1  john 
     1  sam 
     2  ram 
     3  hari  

在这里,人们可以empname属于任意数量的department秒。

我的要求是从department表中得到所有的部门,其中empname!=john(加入)。

我试着用下面的查询:

SELECT d.id FROM department d 
INNER JOIN employee e ON d.id=e.fkdepartmentid 
    WHERE((e.empname<>'1')OR d.id IN (SELECT DISTINCT fkdepartmentid FROM employee WHERE fkdepartmentid NOT IN (SELECT DISTINCT fkdepartmentid FROM employee WHERE empname=sam))) GROUP BY d.id 

但是,查询速度慢,在某些情况下失败。 结果应该是2和3.我该如何实现这些结果?

+0

我想你可能会问错了问题的数据库。在'员工'表中,每个部门都有一个“非约翰”员工,因此,将您的需求逐字地转换为SQL查询将返回所有部门*,除非*部门不包含任何人*但*约翰。 –

回答

0
Here you go 

SELECT * FROM department WHERE id IN(SELECT fkdepartmentid FROM employee WHERE empname !='john' GROUP BY fkdepartmentid) 
+0

我想你可能会向数据库提出错误的问题。在'员工'表中,每个部门都有一个“非约翰”员工,因此,将您的需求逐字地转换为SQL查询将返回所有部门*,除非*部门不包含任何人*但*约翰。 –

+0

看到他的问题,他确切地要求'empname!= john'没有发生名称 –

+0

哎呀。我的意思是把它作为对问题的评论,而不是你的回答。抱歉。 :) –

0

如果理解正确,您想排除部门1,因为Jhon是该部门的雇主。如果是这样你需要扭转这种情况。

尝试

SELECT * 
    FROM department 
WHERE id NOT IN 
( 
    SELECT fkdepartmentid 
    FROM employee 
    WHERE empname = 'john' 
    GROUP BY fkdepartmentid 
) 

输出:

 
| ID | DEPARTMENTNAME | 
----------------------- 
| 2 |    y | 
| 3 |    z | 

这里是SQLFiddle演示

+0

@shashankaemmadi它有帮助吗? – peterm

0

这里是一个不使用嵌套查询:

SELECT t1.* 
FROM department AS t1 
LEFT JOIN employee AS t2 
ON t2.deptid = t1.id AND t2.name IN ('john', 'rari') 
WHERE t2.name IS NULL; 

这列出了所有没有任何员工名单在列表中的部门。

+0

嗨,这个查询工作时有一个value.but,如果我想获得不具有员工约翰和公羊它不工作作为expected.INSERT INTO员工(fkdepartmentid,empname) VALUES (1部门,“约翰'), (1, 'SAM'), (1, '配有'), (2, 'RAM'), (2, 'ram6'), (3, 'rari'), (4,'john'), (4,'raqm8');为了这个,我尝试SELECT * FROM 部门为T1 左加入的员工为T2上t2.fkdepartmentid = t1.id和(t2.empname = 'SAM' 或t2.empname = RAM) 其中T2。fkdepartmentid为null。不介意请帮助我。 –

+0

更新后的答案如何? – inquisitive

相关问题