2013-06-13 116 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

相關問題