Seite 1 von 1

SQL-99 Konformität...

Verfasst: 5. Sep 2009 22:56
von oren78
folgende frage...

dürfen wir folgende SQL funktionen verwenden...?

ucase()
lcase()
mid()
len()
round()
now()
format()
datediff()

etc. ??

ich wollte das zeugs mit dem SQL99 validator (link aus der webseite) checken bekam aber:

Code: Alles auswählen

Oops - We're sorry but there seems to be a problem!
 
Why not check back later? Or - pay a visit to www.mimer.com and see what's happening there.

If you're in a real hurry, send an e-mail to webmaster@mimer.com and we'll fix things ASAP.
EDIT:

nochwas wegen einem semikolon nach den kompletten sql-statement...ist dies pflicht oder optional ? hab im netz das hier gefunden..
Semicolon after SQL Statements?

Some database systems require a semicolon at the end of each SQL statement.

Semicolon is the standard way to separate each SQL statement in database systems that allow more than one SQL statement to be executed in the same call to the server.

We are using MS Access and SQL Server 2000 and we do not have to put a semicolon after each SQL statement, but some database programs force you to use it.

Re: SQL-99 Konformität...

Verfasst: 6. Sep 2009 10:37
von n-finity
Da der SQL Validator noch immer außer Betrieb ist, schließe ich mich an diesen Thread mal an.

Übung 5, Aufgabe 2.16

Meine Lösung:

Code: Alles auswählen

SELECT leser.nachname, COUNT( exemplar.leser )
FROM exemplar
JOIN leser ON leser.id = exemplar.leser
GROUP BY leser.id

MuLo-Variante:

Code: Alles auswählen

SELECT L.Nachname, Anzahl
FROM Leser L,
(SELECT L.ID AS ID, COUNT(E.ISBN) AS Anzahl
FROM Exemplar E, Leser L
WHERE E.Leser = L.ID
GROUP BY L.ID) Temp
WHERE L.ID = Temp.ID;

Ist meine Variante auch okay? Meine Zweifel kommen aus der MuLo zu 2.15, wo explizit steht:
HINWEIS:
L.ID darf im SELECT-Statement auftauchen, da nach diesem Attribut gruppiert
wird. L.Nachname darf hier beispielsweise nicht verwendet werden, womit es deutlich
schwieriger wird, wenn man sich statt der ID den Nachnamen anzeigen lassen möchte.

Re: SQL-99 Konformität...

Verfasst: 6. Sep 2009 10:39
von oren78
deine variante ist meine meinung nach völlig in ordnung, die mulo drückt das selbe ja auch aus, aber eben etwas komplizierter ;-)

Re: SQL-99 Konformität...

Verfasst: 6. Sep 2009 10:46
von n-finity
Ja, der Meinung bin ich auch. Verwirrt hat mich nur der (jetzt fett markierte ;)) Hinweis aus der MuLo, dass meine Variante eben nicht geht.

Nunja. Geht - und wird schon okay sein. :D

Re: SQL-99 Konformität...

Verfasst: 6. Sep 2009 14:37
von Steven
n-finity hat geschrieben:Meine Lösung:

Code: Alles auswählen

SELECT leser.nachname, COUNT( exemplar.leser )
FROM exemplar
JOIN leser ON leser.id = exemplar.leser
GROUP BY leser.id
Das geht nicht. Die Musterlösung hat hier vollkommen recht! Wenn du Aggregatfunktionen verwendest, darfst du außerhalb nur die Attribute verwenden, nach denen du auch gruppierst. Diese allgemeine Regel ist nötig, da die Ausgabespalten sonst nicht zwingend eindeutige Werte besitzen. Beispiel: Tabelle A mit den Spalten Name, Gehalt erhält {("Peter", 100), ("Karl", 100"), (Maria, 105)}. Wenn du jetzt nach Gehalt gruppierst und den Namen ausgeben willst, welcher Name soll für das Gehalt 100 angezeigt werden? Um solche Fälle auszuschließen, darfst du den Namen hier nicht selektieren, wenn du nur nach Gehalt gruppierst.

Der Vollständigkeit halber noch die Meinung eines MS SQL Server 2008 Enterprise Edition zu deiner oben angegebenen Lösung:

Code: Alles auswählen

Column 'Leser.Nachname' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Re: SQL-99 Konformität...

Verfasst: 6. Sep 2009 14:59
von n-finity
interessant. bei mir (xampp lite, mysql) funktioniert das tadellos.

aber danke... ich werds dann wohl doch lieber komplizierter machen.

Re: SQL-99 Konformität...

Verfasst: 6. Sep 2009 16:56
von Diablo
Warum darf ich nciht nach leser id und nachname groupieren ???

Code: Alles auswählen

SELECT leser.nachname, COUNT( exemplar.leser )
FROM exemplar
JOIN leser ON leser.id = exemplar.leser
GROUP BY leser.id, leser.nachname
Weil zu der Leserid gehört ja ein Leser mit vor und Nachnamen ... d.h. Nachname sollte immer gleich sein passen mit Id ... ODER ??

Re: SQL-99 Konformität...

Verfasst: 6. Sep 2009 17:39
von Steven
Ich sehe keinen Grund, warum das nicht gehen soll. Nach mehreren Spalten zu gruppieren ist möglich, egal, ob du diese anschließend selektierst oder nicht.

Re: SQL-99 Konformität...

Verfasst: 6. Sep 2009 18:12
von s_n
Dann gibts aber Probleme, wenn es 2 unterschiedliche Leser mit gleichen Nachnamen gibt.

Re: SQL-99 Konformität...

Verfasst: 6. Sep 2009 18:20
von The One and Only Markus
Leute der SQL-99 Validator funktioniert! Ihr müsst nur den Haken bei "Yes, save my SQL statement(s)." wegmachen!

Re: SQL-99 Konformität...

Verfasst: 6. Sep 2009 18:22
von n-finity
Danke für den Hinweis!

Der Validator liefert:

Result:
Conforms to Core SQL-99

Aber naja.. ich merks mir einfach für die Klausur und geb ggf. ne Erklärung dazu ab - oder schreib einfach (wenn ichs hinkrieg) die kompliziertere Variante.

Re: SQL-99 Konformität...

Verfasst: 6. Sep 2009 18:22
von Diablo
Genau das ist meine Frage. Eigentlich sollte "Er" doch nach ID und Nachname Groupieren also setzt er nur die als Gruppe zusammen wo Nachname und ID immer gleich sind.

Das heisst es kann einen Herrn Peffni mit der ID 123 geben und einen Herrn Peffni mit der ID 321 sind aber zwei verschiedene Groupierungen da beides gleich sein müsste...
Wenn ich lustig bin kann ich ja auch einfach ein Select * auf eine Relation machen und nach allen Groupieren ... würde mir nur ncihts bringen da ich dann die gleiche Relation raus bekommen würde ...

Oder ich könnte nach vor und nachnamen Groupieren und dann z.B. nen count noch machen und wüsste so wie oft der gleiche vor und nachname vorkommt ...