SQL Abfrage aus 2 mach eins

Huette

Benutzer
Beiträge
7
Hallo folgendes Problem:

Ich habe 2 Tabellen:

Mitarbeiter : Mitarbeiternummer, Name
Qualifikation : Mitarbeiternummer, Laufende_Nr, Qualifikation

Jetzt ist gefragt, welcher Mitarbeiter (Ausgabe: Mitarbeiternummer und Name) die meisten Qualifikationen hat.
Ich würde das über 2 Abfragen lösen:

Abfrage_1
SELECT Mitarbeiter.Mitarbeiternummer, COUNT(*) AS Anzahl
FROM Mitarbeiter, Qualifikation
WHERE Mitarbeiter.Mitarbeiternummer=Qualifikation.Mitarbeiternummer
GROUP BY Mitarbeiter.Mitarbeiternummer;

Abfrage_2
SELECT Mitarbeiternummer, Name
FROM Mitarbeiter
WHERE Mitarbeiternummer = (SelectMitarbeiternummer FROM Abfrage_1 Where Anzahl = (Select max(Anzahl) FROM Abfrage_1));

bekomme ich das auch in eine Abfrage? jemand ne Idee ?
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.028
Hallo folgendes Problem:

Ich habe 2 Tabellen:

Mitarbeiter : Mitarbeiternummer, Name
Qualifikation : Mitarbeiternummer, Laufende_Nr, Qualifikation

Jetzt ist gefragt, welcher Mitarbeiter (Ausgabe: Mitarbeiternummer und Name) die meisten Qualifikationen hat.
Ich würde das über 2 Abfragen lösen:

Abfrage_1
SELECT Mitarbeiter.Mitarbeiternummer, COUNT(*) AS Anzahl
FROM Mitarbeiter, Qualifikation
WHERE Mitarbeiter.Mitarbeiternummer=Qualifikation.Mitarbeiternummer
GROUP BY Mitarbeiter.Mitarbeiternummer;

Abfrage_2
SELECT Mitarbeiternummer, Name
FROM Mitarbeiter
WHERE Mitarbeiternummer = (SelectMitarbeiternummer FROM Abfrage_1 Where Anzahl = (Select max(Anzahl) FROM Abfrage_1));

bekomme ich das auch in eine Abfrage? jemand ne Idee ?

Ja. Du erweiterst Deinen JOIN passend.

Hint: arbeite lieber mit expliziten statt impliziten JOINs.
 

akretschmer

Datenbank-Guru
Beiträge
9.028
wie ? und was heisst explizite Joins ?

Statt

Code:
... from table1, table1 ... where table1.col = table2.col

besser

Code:
... from table1 left join table2 on (table1.col = table2.col)

Man nimmt die JOIN-Condition aus dem WHERE, wo diese nur verwirrend in Erscheinung tritt, und behandelt sie extra im ON(...)

Intelligente Systeme dröseln das selber auf, aber es ist definitiv besser lesbar und u.U. auch besser für den Planner verständlicher.
 

Huette

Benutzer
Beiträge
7
ah okay... aber ich habe jetzt garkein plan, wie ich die Abfragen so verändere, das es eine ist. Eine vorgehensweise wäre nicht schlcht...
 

akretschmer

Datenbank-Guru
Beiträge
9.028
ah okay... aber ich habe jetzt garkein plan, wie ich die Abfragen so verändere, das es eine ist. Eine vorgehensweise wäre nicht schlcht...

Code:
test=# create table mitarbeiter (nummer int primary key, name text); 
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "mitarbeiter_pkey" for table "mitarbeiter"
CREATE TABLE                                                                                             
Time: 4,265 ms                                                                                           
test=*# create table quali (ma_nummer int references mitarbeiter, quali text);
CREATE TABLE
Time: 23,866 ms
test=*# insert into mitarbeiter values (1, 'max');
INSERT 0 1
Time: 0,542 ms
test=*# insert into mitarbeiter values (2, 'moritz');
INSERT 0 1
Time: 0,187 ms
test=*# insert into quali values (1,'Grillmaster');
INSERT 0 1
Time: 0,576 ms
 
--...
 
test=*# select m.name, count(q.*) from mitarbeiter m left join quali q on (m.nummer=q.ma_nummer) group by m.name;
  name  | count
--------+-------
 max    |     1
 moritz |     0
(2 rows)

Time: 0,432 ms

Die Erweiterung dieser Abfrage auf die Mitarbeiternummer überlasse ich Dir zur Übung.

Andreas
 

Huette

Benutzer
Beiträge
7
danke, aber der count soll ja nicht angezeigt werden. Nur name und Mitarbeiternummer und auch nur von dem der die meisten qualifikationen hat... Aber wenn ich count nicht im ersten Select mache, wo, wie dann ?
 

akretschmer

Datenbank-Guru
Beiträge
9.028
danke, aber der count soll ja nicht angezeigt werden. Nur name und Mitarbeiternummer.... Aber wenn ich count nicht im ersten Select mache, wo, wie dann ?

Was willst Du dann wissen?

Zitat:
Code:
Jetzt ist gefragt, welcher Mitarbeiter (Ausgabe: Mitarbeiternummer und Name) die meisten Qualifikationen hat.

Wie soll nun bewertet werten, wenn Mitarbeiter A 5 Qualis hat und Mitarbeiter B 7? Wer ist besser?

Andreas
 

Huette

Benutzer
Beiträge
7
Ausgabe soll sein:

Mitarbeiternummer | Mitarbeitername
-----------------------|---------------------

und zwar von dem, der der meisten Qualifikationen hat

in deinem Beispiel müsste nur die mitarbeiternummer und der name von Mitarbeiter B angezeigt werden, da er die meisten qualis hat. Angenommen beide haben 7 qualis dann natürlich beide anzeigen lassen.......
 

akretschmer

Datenbank-Guru
Beiträge
9.028
Ausgabe soll sein:

Mitarbeiternummer | Mitarbeitername
-----------------------|---------------------

und zwar von dem, der der meisten Qualifikationen hat

in deinem Beispiel müsste nur die mitarbeiternummer und der name von Mitarbeiter B angezeigt werden, da er die meisten qualis hat. Angenommen beide haben 7 qualis dann natürlich beide anzeigen lassen.......

Es gibt keine Mitarbeiter B. Nur 1 und 2. Was wäre, wenn 2 oder mehr gleich viele Quais haben?

Code:
test=*# select m.nummer, m.name, count(q.*) from mitarbeiter m left join quali q on (m.nummer=q.ma_nummer) group by m.nummer, m.name order by 3 desc limit 1;
 nummer | name | count
--------+------+-------
      1 | max  |     1
(1 row)
 

Huette

Benutzer
Beiträge
7
Wenn 2 oder mehr gleichviele qualis haben würden halt mehrere angezeigt. wenn nur einer die meisten hat, dann nur einer....
Aber die Ausgabe soll trotzdem

Mitarbeiternummer | Mitarbeitername sein... mehr nicht...
 

akretschmer

Datenbank-Guru
Beiträge
9.028
Wenn 2 oder mehr gleichviele qualis haben würden halt mehrere angezeigt. wenn nur einer die meisten hat, dann nur einer....
Aber die Ausgabe soll trotzdem

Mitarbeiternummer | Mitarbeitername sein... mehr nicht...

Code:
test=# select * from mitarbeiter ;
 nummer |  name
--------+--------
      1 | max
      2 | moritz
(2 rows)

Time: 0,166 ms
test=*# select * from quali ;
 ma_nummer |    quali
-----------+-------------
         1 | Grillmaster
         1 | Biertrinker
         2 | Biertrinker
(3 rows)

Time: 0,153 ms
test=*# select m.nummer, m.name from mitarbeiter m left join quali q on (m.nummer=q.ma_nummer) group by m.nummer, m.name having count(q.*) = (select max(count) from (select ma_nummer, count(*) from quali group by ma_nummer) foo);
 nummer | name
--------+------
      1 | max
(1 row)

Time: 0,496 ms
test=*# insert into quali values (2,'Biertrinker');
INSERT 0 1
Time: 0,308 ms
test=*# select m.nummer, m.name from mitarbeiter m left join quali q on (m.nummer=q.ma_nummer) group by m.nummer, m.name having count(q.*) = (select max(count) from (select ma_nummer, count(*) from quali group by ma_nummer) foo);
 nummer |  name
--------+--------
      2 | moritz
      1 | max
(2 rows)

Geht möglicherweise eleganter, aber dazu fehlt momentan noch der Kaffee...
 

Huette

Benutzer
Beiträge
7
Der mittlere sieht ganz gut aus. Ist der so in z.B. MS Access übertragbar ?

vielen Dank !
 
Werbung:
Oben