2016-05-23 42 views
-1

我有以下模式:什么应该是正确的SQL

employee(fname,lname,e_no,age,address,sex,slary,dept_number) 

dpartment(dept_name,dept_number,dept_location) 

project(pname,pnumber,plocation,dept_number) 

works_on(e_no,pnumber,hours) 

我一定要找到,所有的员工工作超过3 hours.There可能是某些情况下,雇员工程项目的名称少于3小时,但其他人超过3小时。 我需要所有员工工作时间超过三小时的项目名称。无法弄清楚如何考虑这一点。

请帮我一把!感谢

+0

您是否尝试过连接表格? – jarlh

+0

[你有什么尝试?](http://mattgemmell.com/what-have-you-tried/) – Pred

回答

2

当你改一下你的问题是找到其中任何员工工作不到三个小时项目,即最小时间大于三:

SELECT p.pname 
FROM project AS p 
JOIN works_on AS w ON p.pnumber = w.pnumber 
GROUP BY p.pname 
HAVING MIN(hours) > 3 

或使用NOT EXISTS:

SELECT * 
FROM project AS p 
WHERE NOT EXISTS 
(SELECT * 
    FROM works_on AS w 
    WHERE p.pnumber = w.pnumber 
    AND hours <= 3 
) 

小心,这不完全相同,因为它会返回没有分配员工的项目。

+0

不错,简单...谢谢:)) –

2

试试这个:

SELECT p.pname 
FROM project AS p 
JOIN works_on AS w ON p.pnumber = w.pnumber 
GROUP BY p.pname 
HAVING COUNT(CASE WHEN hours > 3 THEN 1 END) = COUNT(*) 
+0

似乎工作...你能解释有条款请...没有太多'有'在我的SQL ...事实上,我很新这个..一些解释会很好 –

+0

@ AL-zami'COUNT(CASE当时> 3 THEN 1 END)'被称为*条件聚合*:它计数记录有超过3小时。如果这个数字等于'COUNT(*)',那么*所有*项目记录的关联时间超过3小时。 –

相关问题