2016-05-23 5 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 часов, а другие - более трех часов. Мне нужно название проекта, где все сотрудники работают более трех часов. Не могу понять, как это учитывать.

Пожалуйста, помогите мне! спасибо

+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 

Или НЕ ИСПОЛЬЗУЙТЕ:

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 ... infact я довольно новичок в этом .. некоторое объяснение было бы хорошим –

+0

@ AL-zami 'COUNT (CASE WHEN hours> 3 THEN 1 END)' называется * условным агрегатом *: он подсчитывает записи, имеющие более 3 часов. Если это число равно 'COUNT (*)', то * все * проектные записи имеют более 3 часов. –

Смежные вопросы