Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

1

14.12.2011, 23:19

[Gelöst] SQL Join

Wir haben derzeit SQL in der Uni und ich muss zugeben, dass ich damit leicht eingerostet bin.
Wir haben die folgenden Tabellen:
http://imageshack.us/photo/my-images/694/tabellen.png/

Und sollen

Zitat

Die Vor- und Nachnamen von Personen sowie die Anzahl der Bücher, die sie entweder geschrieben oder
begutachtet haben
selektieren.

Mein Versuch sieht so aus, möchte ich die Anzahl nur jeweils für eine Tabelle, Joine ich einfach:

Quellcode

1
2
3
4
SELECT P.Vorname, P.Nachname, COUNT(*) AS Anzahl
FROM Person P
INNER JOIN schreibt S ON S.Autor = P.PID
GROUP BY P.PID

Das geht für beide Tabellen (schreibt, begutachtet) separat sehr gut, aber wie mache ich es, wenn ich die addierte Anzahl von schreibt und begutachtet haben will?

Hoffe hier kann mir jmd. helfen, ich hab heut echt 'ne lange Leitung :/

edit:
Kleiner Nachtrag:
An so etwas hatte ich auch bereits gedacht:

Quellcode

1
2
3
4
5
SELECT P.Vorname, P.Nachname, COUNT(S.Autor) AS AnzahlS, COUNT(Ba.Lektor) AS AnzahlB
FROM Person P
LEFT JOIN schreibt S ON S.Autor = P.PID
LEFT JOIN begutachtet Ba ON Ba.Lektor = P.PID
GROUP BY P.PID


Nur dass dann meine Ausgabe die folgende ist:

Quellcode

1
2
3
4
AnzahlS    AnzahlB
2              2
2              2
2              2

Was, meiner Ansicht nach, Falsch ist, da jeweils 3 rauskommen müsste.

edit 2:
Mal auf die guten alten Joins verzichtet und tada, es funktioniert.
Mal sehen ob es noch besser geht, aber erstmal so siehts bisher aus:

Zitat


SELECT P.Vorname, P.Nachname,
(SELECT COUNT(S.Autor) FROM schreibt S WHERE S.Autor = P.PID GROUP BY S.Autor) +
(SELECT COUNT(Ba.Lektor) FROM begutachtet Ba WHERE Ba.Lektor = P.PID GROUP BY Ba.Lektor) AS Anzahl
FROM Person P
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Architekt« (15.12.2011, 00:13)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

15.12.2011, 06:57

Damit hast Du aber das "entweder ... oder" in ein "und" umgewandelt. Ist das noch die Aufgabenstellung?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

3

15.12.2011, 09:45

Gute Frage. Ich erhalte das gewünschte Ergebnis und ein schönerer query ist mir nicht eingefallen. Doppelte Joins bekomm ich jedenfalls nicht in den Griff. Hast du eine andere Idee?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

4

15.12.2011, 10:33

er meint wohl eher, dass es so aussehen sollte:

Quellcode

1
2
3
4
SELECT P.Vorname, P.Nachname,
(SELECT COUNT(S.Autor) FROM schreibt S WHERE S.Autor = P.PID GROUP BY S.Autor),
(SELECT COUNT(Ba.Lektor) FROM begutachtet Ba WHERE Ba.Lektor = P.PID GROUP BY Ba.Lektor) AS Anzahl
FROM Person P;

ist das GROUP BY in den Unterabfragen überhaupt erforderlich?
könnte man es nicht zu folgendem vereinfachen?

Quellcode

1
2
3
4
SELECT P.Vorname, P.Nachname,
(SELECT COUNT(S.Autor) FROM schreibt S WHERE S.Autor = P.PID),
(SELECT COUNT(Ba.Lektor) FROM begutachtet Ba WHERE Ba.Lektor = P.PID) AS Anzahl
FROM Person P;
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

5

15.12.2011, 10:39

Ja das GROUP BY ist überflüssig, in der finalen Version auch nicht mehr dabei.
Aber wieso nicht addieren wenn ich doch die Gesamtzahl von begutachteten und geschriebenen brauche?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

6

15.12.2011, 10:43

das ist das, worauf Blue Cobold hinweisen wollte:
in der Aufgabenstellung, die du oben geschrieben hast, steht entweder geschrieben oder gelesen, nicht geschrieben und gelesen
ich würde bei dem entweder oder zwar eher verstehen, dass sich auf irgendeine Art entscheiden muss, was angezeigt werden soll, allerdings müsste die Bedingung dafür auch mit angegeben sein...
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

7

15.12.2011, 10:48

Soweit ich weiß sollen wir solche "entweder ... oder ... " als normales "oder" verstehen. Und dann dachte ich "Ok, also die Gesamtzahl der Bücher, die entweder geschrieben ODER [auch] begutachtet wurden." Bin mir nun aber mehr als unsicher dank euch :P
Ihr würdet also keine Addition benutzen und somit die Werte getrennt ausgeben?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

15.12.2011, 10:51

Selbst ein "oder" ist kein "und" und auch kein "entweder oder" ;) Ich weiß halt nicht, ob das wirklich das ist, was die Aufgabenstellung meint, oder ob da tatsächlich zwei separate Summen als Lösung erwartet werden. Typische Fragen eines Studenten an seine Übungsaufgabe, würde ich sagen :D
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

9

15.12.2011, 10:52

Selbst ein "oder" ist kein "und". Eine Addition beider Summen ist aber ein "und". Ich weiß halt nicht, ob das wirklich das ist, was die Aufgabenstellung meint, oder ob da tatsächlich zwei separate Summen als Lösung erwartet werden.



Eigentlich ist das "Oder" in SQL doch als Vereinigung anzusehen, jedenfalls war mir so, weswegen ich letzendlich auch die Gesamtzahl genommen habe.
Irre ich mich da oder hab einen Denkfehler?

edit: Werde das jetzt erstmal so abgeben und berichte dann nächste Woche ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

15.12.2011, 10:54

Sprachliches "Oder" (das Eine oder das Andere [aber nicht beides]) und logisches "Oder" (true oder false) sind eben verschiedene Dinge ;) Wie gesagt, wenn Du damit leben kannst, prima. Ist halt eine Frage der Interpretation der Aufgabenstellung. Ich hätte vermutlich als Lösung alles drei gemacht: Summe der gelesenen, Summe der geschriebenen und Gesamtsumme aller :thumbsup: oder meinen Prof gefragt, wie er die Aufgabe genau meint.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige