2016-05-23 13 views
-1

sein Ich habe folgendes Schema:Was sollte die richtige 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) 

ich den Namen der Projekte zu finden, wo alle Mitarbeiter mehr als 3 hours.There arbeiten könnten einige Fälle, in denen der Arbeitnehmer tätig sein weniger als 3 Stunden, aber andere mehr als drei Stunden. Ich brauche den Projektnamen, wo alle Mitarbeiter mehr als drei Stunden arbeiten. Ich kann nicht herausfinden, wie man das in Betracht zieht.

Bitte helfen Sie mir! Dank

+0

Haben Sie versucht, Tabellen zu verbinden? – jarlh

+0

[Was hast du probiert?] (Http://mattgemamm.com/what-have-you-tried/) – Pred

Antwort

2

Wenn Sie Ihre Frage umformulieren ist es die Projekte finden, wo kein Mitarbeiter weniger als drei Stunden, dh die Mindest Stunden arbeitet, ist größer als drei:

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 

Oder mit NICHT VORHANDEN:

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

Vorsicht, das ist nicht genau dasselbe, da es Projekte ohne zugewiesene Mitarbeiter zurückgibt.

+0

schön und einfach ... danke :)) –

2

Try this:

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

scheint zu funktionieren ... kannst du die having-Klausel bitte erklären ... habe nicht viel 'having' benutzt in meinem sql ... infact ich bin ziemlich neu zu diesem .. eine Erklärung wäre nett –

+0

@ AL-zami 'COUNT (CASE WHEN Stunden> 3 THEN 1 END)' wird ein * bedingtes Aggregat * genannt: Es zählt Datensätze mit mehr als 3 Stunden. Wenn diese Zahl gleich 'COUNT (*)' ist, dann sind * alle * Projektdatensätze mehr als 3 Stunden zugeordnet. –

Verwandte Themen