Warum funktioniert USING hier nicht ?

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.

Warum funktioniert USING hier nicht ?
Hi, wer weiß was hier los ist ? :slight_smile:

Attachment:
Frage 2.png: https://fsi.cs.fau.de/unb-attachments/post_128222/Frage 2.png


Keine Ahnung ob das im SQL-Standard auch so spezifiziert ist, aber MySQL, MSSQL und Oracle SQL interpretieren das USING etwas anders als es auf den ersten Blick scheint:
Bei der USING Klausel nimmt das DBS automatisch die vorhergehende Tabelle.

Das heißt in deinem Fall würde aus

SELECT *
FROM tab1
JOIN tab2 USING (key1)
JOIN tab3 USING (key2)

Das werden:

SELECT *
FROM tab1
JOIN tab2 ON tab1.key1=tab2.key1
JOIN tab3 ON tab2.key2=tab3.key2

Dementsprechend ist es auch mit deinem Beispiel. Nur, dass nach dem ON dann halt mehrere Attribute mit AND stünden.

Allgemein kann ich jedem empfehlen so spezielle Sachen wie USING, EXCEPT (was äquivalent zu NOT IN ist), usw. möglichst zu vermeiden.
Diese Keywörter wurden meistens auf spezielle Situationen zugeschnitten und sind somit was Performance angeht die beste Wahl.
Aber wir wollen hier “nur” eine Klausur bestehen und kein Google 2.0 schreiben, weswegen man sich wirklich auf die grundlegenden Dinge beschränken sollte, auch wenn manches schöner/leichter/verständlicher aussieht, meist bergen diese Keywörter “komische” oder zumindest nicht ganz transparente Verhaltensweisen.


ja stimmt, dachte mir nur dass ich mir damit schreibaufwand sparen kann, aber mir ist dass langsam auch zu blöd, dann schreib ich halt alles explicit hin ^^

lernst du so sachen wie exists und any ? weil das hab ich bis jetzt noch nicht in einem braindump gesehen …

ist das deiner meinung nach zu “deep” ?


ah ich glaub ich habs selber rausgefunden, ich glaube es liegt an produkt_lager_lagerbestellung, dort gibt es nämlich auch nochmal strasse,hausnummer,plz und Stadt als attribute, deshalb beschwert sich SQL weil es nicht weiß welches es nehmen soll :slight_smile: Tada … naja danke für die Hilfe :stuck_out_tongue:

Attachment:
lager.png: https://fsi.cs.fau.de/unb-attachments/post_128226/lager.png


Aus dem MYSQL-Handbuch:

Das Wort IN ist ein Alias für = ANY. Insofern sind die folgenden beiden Anweisungen gleichwertig:

SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 IN    (SELECT s1 FROM t2);

Quelle: http://dev.mysql.com/doc/refman/5.1/de/any-in-some-subqueries.html

MySQL ist zwar nicht SQL-Standard, aber abgesehen von gewissen Erweiterungen und Verallgemeinerungen (vorallem im Bezug auf Group By) hält sich MySQL an den Standard.
Dementsprechend ist = Any auch mit IN auszudrücken.
<> Any dafür nicht.

Das heißt strenggenommen sollte man das auch können, da es durchaus ein paar exotische Situationen gibt, wo man das gebrauchen könnte, aber in meinen Augen lässt sich jede SQL-SELECT-Klausur-Aufgabe nur mit JOINS, GROUP BY, IN, ORDER BY, Subqueries, HAVING und den Aggregatfunktionen lösen.

Mir ist in der Praxis auch noch kein einziges Beispiel unter die Finger gekommen, wo ich mehr als das oben genannte aus dem SQL-Standard gebraucht hätte.

Edit:
Exists brauchst du für Assertions, wäre also sinnvoll Exists zu lernen. :wink:

1 Like

kann mir jemand sagen ob das richtig ist?
Danke!!

MfG

Attachment:
SQL.JPG: https://fsi.cs.fau.de/unb-attachments/post_128248/SQL.JPG


EDIT1:
du kannst beim ersten statement das zweite group by weglassen, musst du aber nicht

ansonsten waren ein paar kleinere Feher drin - z.B. musst du wenn du eine Tabelle in “FROM” mit “s” bennenst auch auf diese wieder mit s. zugreifen
– antwort 8Punkte

select s.SchauspielerId, s.Name, count(f.FilmId) as anzahl
from film f, schauspieler s, spielt_in si
where f.FilmId = si.FilmId
and s.SchauspielerId = si.SchauspielerId
and f.genre = ‘Horror’
group by s.SchauspielerId, s.Name

–antwort

  1. das muss meiner Meinung nach so aussehen:

EDIT2:

–antwort 10Punkte
create view SchauspielerFilme as
select s.SchauspielerId, s.Name, count(*) as anzahl
from Schauspieler s
join spielt_in using(SchauspielerId)
join Film f using(FilmId)
group by s.SchauspielerId, f.FilmId;

select SchauspielerId,Name,count() as anzahl
from SchauspielerFilme
group by SchauspielerId
having count(
) > 10 EDIT 4: hatte ich nicht drin, weil meine Testdaten nur für kleine Mengen angelegt waren

drop view SchauspielerFilme
–antwort

EDIT 3:
In der vorgegebenen Tabelle kann ein Schauspieler in einem Film nicht mehrere Rollen spielen - da SchauspielerId und FilmId primary key sind
also ist der Braindump wohl falsch - habe in meiner Tabelle Rolle mit zum PK gemacht, damit ich die idee testen konnte

  1. das ist falsch -habs getestet:
    Am einfachsten finde ich kann man das nachvollziehen wenn man sich folgendes Vorstellt:

wenn man select * from a,b macht kommt folgendes raus:

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

wenn man dann where N2 <= N1 anwendet das hier:

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

letztendlich kommt
c s
a 2
b 4

raus.

Hoffe das hilft


hi
@hedge* und nici

ich habe bei 5.2 und 5.3 etwas anderes raus

5.2

CREATE VIEW bla AS
SELECT DISTINCT SchauspielerID, FilmID
FROM spielt_in;

SELECT schauspieler.name, count() AS Anzahl
FROM bla JOIN Schauspieler USING (schauspielerID)
GROUP BY bla.schauspielerID, schauspieler.name
HAVING count(
) >10;

DROP VIEW bla;

5.3
KReuzprodukt:
C n2 n1
a 1 1
b 1 1
b 2 1
a 1 2
b 1 2
b 2 2

where n2<=n2

C n2 n1
a 1 1
b 1 1
b 2 1
a 1 2
b 1 2

b 2 2

sum (n2)

C S
a 1
b 5

erkennst dun fehler ?


@rat010104
n2<=n2 - ist schonmal falsch, sollte N2 <= N1 sein

dein statement läuft:

was bei meinem noch gefehlt hat, ist das Having count(*) > 10
das hat mit meinen testdaten nicht zusammengepasst ^^