SQL

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

SQL
Hallo alle zusammen ,

ich versuch eine SQL zu üben , und bin bei einer Frage gestossen , wo ich Hilfe brauche :smiley:

ist eine Relationenschema gegeben :

Film(FilmID , Name , Genre)
Schauspieler(SchauspielerId , Name )
spielt_in( SchauspielerId[Schauspieler] , FilmID[Film] , Rolle )

die Frage ist :

Geben Sie für alle Schauspieler die in mehr als 10 Filmen mitgespielt haben den Namen und die Anzahl der Filme aus . Achtung : Wenn ein Schauspieler in einem Film mehrere Rollen besetzt hat , zählt nur als 1 Film . Sie dürfen zur Lösung der Aufgabe einen View erstellen.

kann jemand mir sagen , wie das am besten gemacht wird .

vielen Dank im Voraus .


[code=sql]CREATE VIEW anzFilme AS (
SELECT spielt_in.SchauspielerId, Schauspieler.Name, COUNT(DISTINCT spielt_in.FilmId) AS anzahl
FROM spielt_in
JOIN Schauspieler ON Schauspieler.SchauspielerId = spielt_in.SchauspielerId
GROUP BY SchauspielerId, Schauspieler.Name
);

SELECT anzFilme.Name, anzFilme.anzahl
FROM anzFilme
WHERE anzahl > 10;[/code]

Oder

SELECT Schauspieler.Name, COUNT(DISTINCT FilmId) FROM spielt_in JOIN Schauspieler ON Schauspieler.SchauspielerId = spielt_in.SchauspielerId -- Auch wenn Id nicht in Projektion genutzt, ist Gruppierung nach PK wichtig! GROUP BY SchauspielerId, Schauspieler.Name HAVING COUNT(DISTINCT FilmId) > 10;


könntest du mir noch sagen , was du von diese Statement als Aufgabe findest , ich verstehe nämlich nicht , wie ich auf die Antwort kommen

gegeben zwei Tabellen :

N1 C N2
1 a 1
2 b 2
b 2

SELECT C , SUM(N2) AS S
FROM a,b
WHERE N2 <=N1
GROUP BY C
ORDER BY C ;

C , N1 , N2 kein Primärschlüssel


Du sollst das SQL-Statement im Kopf ausführen und das Ergebnis angeben. Dies tust du, indem du das SQL-Statement in der logischen Abfolge durchgehst (FROM, WHERE, dann GROUP BY, …) und die einzelne Schritte am besten hinschreibst. Bei solch einer kleinen Tabelle geht das recht fix.


ich habe das genau gemacht , was du mir jetzt gesagt hast , und bekomme ich eine Tabelle

C S
a 1
b 3

wenn ich das in Tryit Editor eingebe , gibt es mir aber was anderes … ich glaube mein Problem ist wie ich ein JOIN ausführen kann … wenn du sehr nett bist , und mehr durch diesen kleinen Beispiel erklärest , wäre ganz gut :slight_smile:

vielen Dank im Voraus .


Dein zweite Relation kann nicht stimmen, da sie ein Duplikat beinhaltet. Eigentlich sind die Relationen wie folgt:

Relation a:

N1 1 2

Relation b:

C N2 a 1 b 1 b 2

SELECT C , SUM(N2) AS S FROM a,b WHERE N2 <= N1 GROUP BY C ORDER BY C

Zuerst das FROM, danach hast du folgende Tabelle:

N1 C N2 1 a 1 1 b 1 1 b 2 2 a 1 2 b 1 2 b 2

Dann streicht der WHERE-Teil die ersten 3 Tupel und das letzte Tupel: (<-- Falsch, siehe übernächsten Post, hatte statt <= nur < genommen.)

N1 C N2 2 a 1 2 b 1

Das GROUP BY hat hier sozusagen keinen Effekt, da es nur zwei Tupel mit unterschiedlichen Werten in den zu gruppierenden Attributen (hier nur C) gibt.

Die Projektion im SELECT liefert:

C N2 a 1 b 1

Die Summe eines einzigen Tupels in einem Attribut ist genau der Attributwert selbst dieses Tupels.

Das ORDER BY hat bei uns (zufälligerweise) keinen Effekt, da die Tupel bereits sortiert sind.


aber wenn ich das Online in einem SQL Eidtor , bekomme ich was anderes .

ich bekomme eine Tabelle
C S
a 2
b 4

kann es sein , dass den Editor was falsches sagt ? …

ich weiss nicht … deine Tabelle hat mich nicht überzeugt :D:D


Oh, ich habe statt <= einen echt-kleiner Vergleich ‘<’ ausgeführt.

So ist es korrekt:

Zuerst das FROM, danach hast du folgende Tabelle:

N1 C N2 1 a 1 1 b 1 1 b 2 2 a 1 2 b 1 2 b 2
Dann streicht der WHERE-Teil die ersten 3 Tupel und das letzte Tupel: streicht nur das dritte Tupel in obiger Liste.

N1 C N2 1 a 1 1 b 1 1 b 2 2 a 1 2 b 1 2 b 2

Dann GROUP BY C mit aggregiertem N2 mittels SUM()

[code]C SUM(N2)
a 1 + 1 = 2

b 1 + 1 + 2 = 4[/code]

Also

C SUM(N2) a 2 b 4

Das ORDER BY hat bei uns (zufälligerweise) keinen Effekt, da die Tupel bereits sortiert sind.