Antworten auf deine Fragen:
Neues Thema erstellen

SQL - Komplexe Joins (oracle)

Refus

aka Noisy

Ok, es handelt sich um Oracle, also nicht um MySQL oder so. Leider sind nicht alle Befehle gleich. Dennoch komm ich nicht auf die Lösung folgender Anfrage:
Geben Sie das Ergebnis der Partie mit der Spiel_ID 4 aus. Zeigen Sie dazu das Ergebnis, den Gewinner und den Verlierer an.
Die Datenbank sieht wie folgt aus:


Meine bisher "schönste" :)rolleyes:) Lösung sieht wie folgt aus. Ich weiß aber beim besten Willen nicht wie ich Gewinner und Sieger ausgebe.
http://nopaste.info/b4e07ca730.html
Ergibt folgendes Ergebnis:
Code:
PARTIE_ID  |  Ergebnis  |  VEREINSNAME  |  VEREINSNAME
-------------------------------------------------------
      4   |         3:1 |     Heim Verein   | Gast Verein

Im Prinzip sollte jetzt anstelle von VEREINSNAME Gewinner oder Verlierer stehen. Natürlich was ich in dem konkreten Fall, dass die Heimmannschaft gewonnen hat, aber das Spaltenanem sollte möglichst dynamisch generiert werden, oder halt die Werte entsprechend.

Mein Ansatz war folgender (hat natürlich nicht funktioniert ;))
http://nopaste.info/c0258cff05.html (Auszug aus dem Code)
Fehlermeldung dafür:
WHEN "Tore_Heim" > "Tore_Gast" THEN 'Gewinner',
*
ERROR at line 5:
ORA-00923: FROM keyword not found where expected

Irgendjemand eine Idee? Gerne auch wie es generell kürzer geht.

Morgen früh kenn ich zwar die Antwort, aber ich würde es gerne jetzt schon wissen (und verstehen).
Danke an alle, die sich dem Problem zuwenden :)
 

TECFreddy

"alles und nichts"-Könner

AW: SQL - Komplexe Joins (oracle)

Ich hab zwar keine Ahunng von Oracle aber der Fehler sagt ja, dass er das FROM an ner anderen Stelle erwartet, vllt liegts daran.
 

Refus

aka Noisy

AW: SQL - Komplexe Joins (oracle)

Weder noch. War nicht Teil der Aufgabe bzw. wurde später ergänzt. EIne Idee dazu?
 
K

ks7776

Guest

AW: SQL - Komplexe Joins (oracle)

Was kommt denn nach der Zeile 13? Meine Glaskugel ist kaputt. Wie lautet das From-Statement? Darum geht es ja gerade in der Fehlermeldung.
 

Refus

aka Noisy

AW: SQL - Komplexe Joins (oracle)

Das gleiche wie in dem 1. Link. Die Fehlermeldung bezieht sich aber tatsächlich auf die Zeile 5 aus dem Auszug. Er erwartet im Case ein From bzw. unter #3 habe ich die funktionierende Lösung mit CASE gepostet.
 

Duddle

Posting-Frequenz: 14µHz

AW: SQL - Komplexe Joins (oracle)

Na, das war mal eine lustige Herausforderung. Besonders weil ich noch nie mit Oracle gearbeitet hab und hoffentlich auch nicht so bald wieder werden muss. Das größte DBMS kann keinen einfaches LIMIT? Oh Gott ...

Jedenfalls ist folgendes mein Vorschlag. Ich baue es mal schrittweise auf.
Code:
SELECT *
FROM partie p, tor t, spieler s, verein v
WHERE p.partie_id = 4
AND t.spieler_id = s.spieler_id
AND s.vereins_id = v.vereins_id
group by vereinsname
Hier werden alle Tore aller Spieler und ihre Vereine in der Partie 4 aufgelistet. Da die JOIN-Syntax von Oracle nicht wie erwartet funktioniert hat, habe ich es mit dem Kreuzprodukt gemacht. Mit diesen Daten kann ich bestimmen, welches Team wieviele Tore geschossen hat.
Code:
SELECT vereinsname, COUNT(vereinsname) as tore
FROM partie p, tor t, spieler s, verein v
WHERE p.partie_id = 4
AND t.spieler_id = s.spieler_id
AND s.vereins_id = v.vereins_id
group by vereinsname
Da das aber zwei Ergebnisse sind und ich die nicht mit LIMIT ansprechen konnte, hab ich folgendes Hilfskonstrukt gefunden:
Code:
SELECT vereinsname, COUNT(vereinsname) as tore, row_number() over (ORDER BY COUNT(vereinsname) DESC) rn
FROM partie p, tor t, spieler s, verein v
WHERE p.partie_id = 4
AND t.spieler_id = s.spieler_id
AND s.vereins_id = v.vereins_id
group by vereinsname
Hier steht das gleiche drin wie im vorigen Query, aber noch zusätzlich die Spalte rn als Zeilennummer, die strikt über der Anzahl der Tore sortiert ist. Ergo ist in Zeile 1 der Verein mit mehr oder gleich vielen Toren in der Partie. Jetzt packe ich dieses Ding in eine leichter zu handhabende temporäre Tabelle und hole mir die beiden Ergebnisse auf eine Zeile:
Code:
WITH tdp as (
  SELECT vereinsname, 
  COUNT(vereinsname) as tore, 
  row_number() over (ORDER BY COUNT(vereinsname) DESC) rn
FROM partie p, tor t, spieler s, verein v
WHERE p.partie_id = 4
AND t.spieler_id = s.spieler_id
AND s.vereins_id = v.vereins_id
group by vereinsname)

SELECT t1.*, t2.* from
(SELECT vereinsname GEWINNER, tore tg from tdp
where rn = 1) t1,
(SELECT vereinsname VERLIERER, tore tv from tdp
where rn = 2) t2
Das obere ist die temp. Tabelle tdp (Tore der Partie). Das untere ist das reinziehen. In tdp stehen alle notwendigen Informationen drinnen, du kannst das kombinieren und formatieren wie du willst. Wahrscheinlich ist es auch etwas voreilig, den ersten Verein als GEWINNER zu bezeichnen ohne vorher auf ein Unentschieden zu testen. Egal, das kriegst du selbst hin :)

Übrigens sehe ich keinen Grund, "Partie" von "spielt" abzuspalten. Die haben eine 1:1-Beziehung zueinander, gehören also in die gleiche Tabelle.

Edit: dazu muss noch gesagt werden, dass diese Lösung nicht besonders wartungsfreundlich ist. Du kannst hier nur umständlich die gewünschte Partie ändern bzw. es nicht gleichzeitig für alle Partien ermitteln lassen. Aber das war ja nicht die Aufgabenstellung :D


Duddle
 
Zuletzt bearbeitet:

Refus

aka Noisy

AW: SQL - Komplexe Joins (oracle)

Hmm, das Problem an deiner Temporären Tabelle ist, dass du alle Tore der Verein zählst unabhängig von der Partie_ID. Bei dir kommen auch die falsche Vereine raus, mal schauen, ob ich deinen Lösungsansatz bei Gelegenheit mal so ausbaue, dass es funktioniert.


Hmm, meine Lösung wurde angenommen. Hab leider nicht die Musterlösung bekommen, bemühe mich aber nochmal drum. Es war aber wohl auch so gedacht, dass das Ergebnis wie folgt aussieht:

Vereinsame | Tore
Vereinsname Gewinner | 3
Vereinsname Verlierer | 1

Ich steh auf unklare Aufgabe. Ärgerlich aber gut.

Recht hast du bei Oracle, einfach nervig, wenn es nicht mal LIMIT gibt.
Kann schon passieren, dass ich jetzt noch das ein oder andere mal hier nachfrage, wenn die Aufgaben weiter so "schön" sind.
 

Duddle

Posting-Frequenz: 14µHz

AW: SQL - Komplexe Joins (oracle)

Ja, den Fehler habe ich auch gerade gemerkt. Das kommt davon, wenn man auf nur einen Testfall hinarbeitet :)



Duddle
 

Duddle

Posting-Frequenz: 14µHz

AW: SQL - Komplexe Joins (oracle)

Ich mache mal bewusst keinen Edit, weil du sonst vielleicht nicht nochmal in den Thread schaust. Folgendes ist die wahrscheinlich eleganteste Lösung für das gewünschte Ausgabeformat:
Code:
SELECT spiele.partie_id partie, spiele.vereinsname, nvl(tpp.tore,0) tore
FROM (
  SELECT *
  FROM spielt s, verein v
  WHERE s.gastgeber_id = v.vereins_id
  OR s.heim_id = v.vereins_id
) spiele
LEFT OUTER JOIN (
  SELECT t.partie_id, s.vereins_id, count(s.spieler_id) tore
  FROM tor t, spieler s
  WHERE t.spieler_id = s.spieler_id
  GROUP BY t.partie_id, s.vereins_id
) tpp
ON spiele.vereins_id = tpp.vereins_id
AND spiele.partie_id = tpp.partie_id
WHERE spiele.partie_id = 1
Das erste Subselect ist einfach die Spiele und jeweils die beteiligten Teams. Das zweite Subselect gibt die Tore für eine pro Partie pro Verein aus. Das wichtigste ist jetzt der OUTER JOIN, der pro Spiel pro Team die Tore dieses Teams für dieses Spiel ausgibt - aber eben auch NULL, falls für dieses Spiel und dieses Team kein Eintrag in der tpp-Untertabelle existiert. Ein INNER JOIN übergeht letztere Fälle und ist daher nicht ausreichend.

Alle NULL-Werte werden noch in der Ausgabe mit der NVL-Funktion als die Zahl 0 ausgegeben, damit das alles etwas hübscher ist. Jetzt stehen dort pro Partie pro Spiel die geschossenen Tore (bzw. im Beispiel nur für Partie 1).


Duddle
 

Refus

aka Noisy

AW: SQL - Komplexe Joins (oracle)

Duddle, danke, aber :D

ich brauch die Tore pro Mannschaft, und dann sollte angezeigt werden wer Gewinner und Verliere ist. Ich will dir deine Zeit aber jetzt nicht mehr rauben, uns Prof rückt warum auch immer keine Lösung raus (vermutlich, weil er selbst gemerkt hat, dass die Aufgabe total Müll war und er zu faul ist das selbst zu schreiben)


uiii mein 888 Beitrag
 

Duddle

Posting-Frequenz: 14µHz

AW: SQL - Komplexe Joins (oracle)

Naja, die obige Abfrage gibt dir die Teams und ihre Tore für eine bestimmte Partie. Mit meinem ersten (falschen) Ansatz kannst du darauf eine Ordnung forcieren und dann die gewünschten Daten rausholen und formatieren.

Aber egal, du sagst ja selbst die Aufgabe ist Schnee von gestern.


Duddle
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Keine Mitglieder online.

Statistik des Forums

Themen
118.635
Beiträge
1.538.476
Mitglieder
67.559
Neuestes Mitglied
hanuta
Oben