Allen Werten in einer Relation zu geordnet

Mariexshx

Fleissiger Benutzer
Beiträge
57
Wie kann ich eine Abfrage schreiben, die prüft ob ein Schlüssel allen werten einer Relation zugeordnet ist? Also zum bespielt welcher Angestellter hat an allen Fortbildungen teilgenommen? Wenn es eine Tabelle Teilnahme mit personalNr und FortbildungNr gibt ? Eig müsste man ja vergleichen ob bei einer bestimmten personalnr alle fortbildungsnr die es überhaupt gibt aufgeführt werden
 
Werbung:
du könntest je Teilnehmer zählen, an wie vielen er teilnahm. Das kannst Du dann ja vergleichen mit der anzahl angebotener Kurse. Zum Rezept gehört COUNT und GROUP BY.
 
ich lasse jetzt mal Tabellen für Personal und Kurse weg und auch die Foreign Keys und nehme nur die Zuordnungstabelle, wer was besucht hat:

Code:
postgres=# select * from mariexshx ;
 pnr | fnr 
-----+-----
   1 |   1
   1 |   2
   1 |   3
   2 |   1
   3 |   1
   3 |   2
(6 rows)

postgres=# with a as (select count(distinct fnr) from mariexshx ), foo as (select pnr, count(fnr) from mariexshx group by pnr) select pnr, a.count from foo, a where foo.count=a.count;
 pnr | count 
-----+-------
   1 |     3
(1 row)

postgres=#

Also, Personalnummer 1 hat alle 3 Kurse besucht. Okay, nicht ganz korrekt, falls ein Kurs von niemanden besucht wurde wäre das Ergebnis falsch, korrekt wäre die Ermittlung der Kursanzahl aus der Kurstabelle - die ich hier aber nicht habe.
 
Eig dürfte doch jetzt nur die oberste Zeile angezeigt werden, weil es gibt insgesamt 4 Fortbildungen
 

Anhänge

  • 6131281D-7830-4490-90D0-D170ED45FE00.jpeg
    6131281D-7830-4490-90D0-D170ED45FE00.jpeg
    5,9 MB · Aufrufe: 10
Das wäre noch meine Idee gewesen klappt aber leider nicht
 

Anhänge

  • 2C8E002C-D0D7-4D36-B4A8-F36DA86721C0.jpeg
    2C8E002C-D0D7-4D36-B4A8-F36DA86721C0.jpeg
    4,4 MB · Aufrufe: 7
anstatt Bilder, auf denen man das unvollständige SQL nur erraten kann, wäre das vollständige SQL in Textform signifikant sinnvoller, falls Du hier Hilfe erwarten solltest. Ich kann keine Bilder in meine SQL-Konsole einfügen ...
 
Werbung:
Das könnte man auch mit einem Crossjoin, sum() und Case machen:
Code:
SELECT angestellter.Name,
sum(CASE WHEN teilnahme.FortbildungsID IS NOT NULL THEN 1 ELSE 0 END) AS teilnahmen,
count(*) AS moegliche_teilnahmen
FROM angestellter
LEFT JOIN teilnahme
ON angestellter.PersonalNr = teilnahme.PersonalNr
CROSS JOIN fortbildung
WHERE teilnahme.PersonalNr IS NULL
OR teilnahme.FortbildungsID = fortbildung.FortbildungsID
GROUP BY angestellter.Name
PS: Das ist jetzt ungetestet.
 
Zurück
Oben