2010-12-11 5 views
0

T1: Mitarbeiter [id, Gehalt]Innerer Anschluss: Ist das eine optimale Lösung?

T2: Abteilung [Name, Employeeid] (Employeeid ist ein Fremdschlüssel zu T1 id)

Problem: Schreiben Sie eine Abfrage den Namen der Abteilung zu holen, die erhält das maximale Gehalt.

Meine Lösung:

SELECT DISTINCT name 
FROM department AS a 
INNER JOIN employee AS b ON a.employeeid = b.id 
AND b.salary 
IN ( 
    SELECT max(salary) 
    FROM employee AS c 
) 

Edit: Die Problemstellung ist richtig, und wir versuchen nicht, die Mitarbeiter, um herauszufinden, wer das höchste Gehalt hat. Es sagt ".... Abteilung, die empfängt .....", nicht "... Angestellte, die empfängt ....".

Ist das ok? Oder kann das optimiert werden?

+1

Welche Datenbank und Version verwenden Sie? –

+1

Soll man eine Abteilung finden, in der der Angestellte mit maximalem Gehalt arbeitet oder die Abteilung, deren Mitglieder die maximale Summe der Gehälter haben? Denn dein Code sagt eins und dein Text den anderen. –

+2

Und, ist das eine Hausaufgabe? –

Antwort

3

GROUP mit dem Namen der Abteilung und Bestellung von SUM (Gehalt).

SELECT department.name 
FROM department 
JOIN employee ON department.employeeid = employee.id 
GROUP BY department.name 
ORDER BY SUM(salary) DESC 
LIMIT 1 
+0

Nein, die Frage bedeutete, was Sie ursprünglich interpretiert haben: Eine Abteilung hat mehrere Mitarbeiter. Also versuchen wir herauszufinden, in welcher Abteilung die meisten Geldmittel fließen, d. H., Wenn Sie alle Gehälter aller Angestellten in JEDER Abteilung aufsummieren, welche Abteilung hat dann das höchste Gehalt? –

+0

Schöne, tolle Einblicke auf diese auch! –

+0

Diese Abfrage sollte eine Liste von Abteilungen mit einer Summe von Gehältern von Mitarbeitern ** in dieser Abteilung zurückgeben. Mit den Order-by- und Limit-Klauseln wird nur die Abteilung mit dem höchsten Gesamtgehalt zurückgegeben, was mir als Antwort auf die ursprüngliche Frage erscheint. – skajfes

0

Wie wäre:

SELECT employee.id, employee.salary, department.name 
FROM department, employee 
where 
employee.id = department.employeeid and 
employee.salary = (select max(salary) from employee) 
+0

Das wird definitiv schneller laufen. – Arc

+0

Bitte beachten Sie die Tabellenstruktur. Bei allem Respekt für Ihren Aufwand passt die Abfrage noch nicht (Spaltennamen). –

+0

@JavaMental, versuchen Sie es jetzt –