Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   oracle sql anfrage, 2 bedingungen (https://www.delphipraxis.net/185402-oracle-sql-anfrage-2-bedingungen.html)

Jonas Shinaniganz 7. Jun 2015 09:20

Datenbank: oracle db • Version: 11+ • Zugriff über: oracle sql developer

oracle sql anfrage, 2 bedingungen
 
Hallo, ich habe eine eigentlich recht einfache SQL-Anfrage.

Eine TV-Serie hat mehrere Episoden, in welchen je mehrere Schauspieler eine Rolle spielen.
Ich möchte die Schauspieler herausfinden, welche in 2 verschiedenen TV-Serien eine Rolle hatten. Konkret die Schauspieler welche sowohl mal bei Big Bang und Desperate Housewives mitgespielt haben.

Das Übungsblatt kommt von der Uni (ist nur eine von mehreren Aufgaben).

Wortlaut:
"
Welche Personen haben in der Serie The Big Bang Theory und auch in der Serie Desperate Housewives mitgespielt. Geben Sie den Namen der Person und die jeweilige Rolle in den Serien aus. Keine Person soll mehrfach in der Ergebnisliste auftauchen. Verwenden Sie weder SQL-Mengenoperationen noch Unteranfragen."

Mein Problem habe ich mal fett markiert. Ich bekomm es nicht zu Stande ohne meine geliebten SubSelects. Außerdem weiß ich nicht, ob Rollen-Namen verkettet (zb mit Komma) in einer Spalte hinter dem Namen der Person stehen sollen oder dann doch 2 Zeilen für jede Person okay sind. Im ersten Fall fände ich es ziemlich happig.. dann müsste ich ja String-Aggregate verwenden.

Wäre nett wenn jemand das Statement schreiben könnte...

// Relevanter Auszug aus dem Schema:
SERIES (series, title, yearnull)
EPISODE (production→PRODUCTION, series→SERIES, seasonnull, episodenull, air_datenull)
PLAYS (person→PERSON, production→PRODUCTION, role)
PERSON (person, Name)

Und hier mein Ansatz, der mir schon mal alle Schauspieler mit der Rolle in der entsprechenden Serie liefert:

Delphi-Quellcode:
SELECT DISTINCT
  per.NAME, p.role
FROM
  SERIES S
  JOIN EPISODE E ON S.SERIES = E.SERIES
  JOIN PLAYS p ON p.PRODUCTION = E.PRODUCTION
  JOIN PERSON per ON per.PERSON = p.PERSON
  WHERE S.TITLE = 'The Big Bang Theory' OR S.TITLE = 'Desperate Housewives';
Wenn es eine Lösung gibt, die mir 3 Spalten gibt:

Name, "Rolle in DespHous", "Rolle in BigBang", ich wäre sehr dankbar und würde mir genau ansehen, wie die Anfrage strukturiert ist. VIELEN Dank :thumb:

Achso ja, das obligatorische "ich bin verzweifelt und komme echt nicht weiter" .. hier ist es

DeddyH 7. Jun 2015 09:44

AW: oracle sql anfrage, 2 bedingungen
 
Nur eine Idee: beide Serien einzeln hinzujoinen.
SQL-Code:
SELECT
  PER.Name, P1.Role, P2.Role
FROM
  PERSON PER
JOIN
  PLAYS P1 ON P1.PERSON = PER.person
JOIN
  PLAYS P2 ON P2.Person = PER.person
JOIN
  EPISODE E1 ON E1.SERIES = P1.PRODUCTION
JOIN
  EPISODE E2 ON E2.SERIES = P2.PRODUCTION
JOIN
  SERIES S1 ON S1.SERIES = E1.SERIES
JOIN
  SERIES S2 ON S2.SERIES = E2.SERIES
WHERE
  S1.Title = 'The Big Bang Theory'
AND
  S2.Title = 'Desperate Housewives'
Ungetestet

himitsu 7. Jun 2015 09:48

AW: oracle sql anfrage, 2 bedingungen
 
Im Notfall auch LELF JOIN, falls es nicht alles gibt.
z.B. jemand war nur in einer der Serien drin

Und wenn es mehrere Datensätze in einer der JOINs gibt, dann gibt es so auch ein paar kleinere "Problemchen".
z.B. jemand hat mehrere Rollen in der selben Serie gehabt.

DeddyH 7. Jun 2015 09:51

AW: oracle sql anfrage, 2 bedingungen
 
Er will doch die, die in beiden Serien mitgespielt haben, da wäre ein OUTER JOIN kontraproduktiv. Oder habe ich das falsch verstanden?

Olli73 7. Jun 2015 13:10

AW: oracle sql anfrage, 2 bedingungen
 
Zitat:

Zitat von Jonas Shinaniganz (Beitrag 1304368)
Außerdem weiß ich nicht, ob Rollen-Namen verkettet (zb mit Komma) in einer Spalte hinter dem Namen der Person stehen sollen oder dann doch 2 Zeilen für jede Person okay sind. Im ersten Fall fände ich es ziemlich happig.. dann müsste ich ja String-Aggregate verwenden.


Ich gehe mal davon aus, dass der Fragesteller 2 getrennte Spalten für die Rolle(n) in der der jeweiligen Serie wollte (wie du weiter unten auch geschrieben hast). Über die Möglichkeit, dass jemand 2 unterschiedliche Rollen innerhalb der gleichen Serie spielt, hat der Fragesteller entweder nicht nachgedacht oder er wollte, dass du LISTAGG verwendest.

jobo 7. Jun 2015 21:36

AW: oracle sql anfrage, 2 bedingungen
 
Ich denke der Ansatz von DeddyH ist richtig und gewünscht. Es werden alle Anforderungen erfüllt.
Listagg ist zwar nett, braucht aber für die Einschränkung der Serien auf genau 2 einen "aufwändigen" Unterbau ohne Union usw. und ist auch nicht Standard.
Ausnahme wäre, Listagg wurde besprochen oder war sonstwie Teil des Stoffs.

p80286 7. Jun 2015 22:07

AW: oracle sql anfrage, 2 bedingungen
 
Zitat:

Zitat von jobo (Beitrag 1304430)
Ich denke der Ansatz von DeddyH ist richtig und gewünscht. Es werden alle Anforderungen erfüllt.

Dem ist nichts hinzu zu fügen!

Gruß
K-H

Jonas Shinaniganz 16. Jun 2015 10:18

AW: oracle sql anfrage, 2 bedingungen
 
Zitat:

Zitat von DeddyH (Beitrag 1304372)
Nur eine Idee: beide Serien einzeln hinzujoinen.
SQL-Code:
SELECT
  PER.Name, P1.Role, P2.Role
FROM
  PERSON PER
JOIN
  PLAYS P1 ON P1.PERSON = PER.person
JOIN
  PLAYS P2 ON P2.Person = PER.person
JOIN
  EPISODE E1 ON E1.SERIES = P1.PRODUCTION
JOIN
  EPISODE E2 ON E2.SERIES = P2.PRODUCTION
JOIN
  SERIES S1 ON S1.SERIES = E1.SERIES
JOIN
  SERIES S2 ON S2.SERIES = E2.SERIES
WHERE
  S1.Title = 'The Big Bang Theory'
AND
  S2.Title = 'Desperate Housewives'
Ungetestet

Ich konnte mich damit jetzt nochmal beschäftigen.

Zwischen EPISODE und PLAYS ist der Schlüssel PRODUCTION. Als mir das aufgefallen ist, hat es geklappt.

SQL-Code:
SELECT
  PER.Name, P1.Role, P2.Role
FROM
  PERSON PER
JOIN
  PLAYS P1 ON P1.PERSON = PER.PERSON
JOIN
  PLAYS P2 ON P2.Person = PER.PERSON
JOIN
  EPISODE E1 ON E1.PRODUCTION= P1.PRODUCTION
JOIN
  EPISODE E2 ON E2.PRODUCTION= P2.PRODUCTION
JOIN
  SERIES S1 ON S1.SERIES = E1.SERIES
JOIN
  SERIES S2 ON S2.SERIES = E2.SERIES
WHERE
  S1.Title = 'The Big Bang Theory'
AND
  S2.Title = 'Desperate Housewives'
Also hier der obligatorische Dank für die Hilfe. :thumb:

DeddyH 16. Jun 2015 10:36

AW: oracle sql anfrage, 2 bedingungen
 
Sry, Flüchtigkeitsfehler, aber schön, wenn es geklappt hat :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz