PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SQL Frage


Lord Nikon
2004-03-22, 15:17:17
Hi,
hier erstmal das Datenbankmodel:
http://mitglied.lycos.de/itlewen/Beziehungdatenbank.gif
Wie kann ich den Vertreter mit den meisten Kunden rausbekommen? Muss ich das mit der Aggregratfunktion count lösen oder wie ?

Trap
2004-03-22, 15:49:21
Wenn ich die Grafik richtig lese: Garnicht. Es sind weder den Vertretern eindeutig Kunden zugeordnet noch umgekehrt.

Lord Nikon
2004-03-22, 16:20:35
Die Datenbank haben wir(meine Klasse ) gestellt bekommen und ich überlege mir gerade Fragen, die zu dieser Datenbank gemacht werden können.Ich habe mir auch gedacht, dass die Aufgabe unlösbar ist, aber wollte sicherstellen,dass ein zweiter mir das Ergebniss meiner Überlegungen unabhängig von mir bestätigt.

cope
2004-03-22, 22:38:10
Habt ihr die Grafik so bekommen oder hast du sie aus einer Aufgabenstellung heraus erstellt?

Nagilum
2004-03-23, 00:05:31
Vielleicht wird angenommen, dass alle Kunden eines Bezirks automatisch potentielle Kunden eines jeden Vertreters im selben Bezirk sind? Also ne Art Suche nach den meisten potentiellen Kunden? Wobei es eben durchaus mehrere Vertreter pro Bezirk geben kann.

Lord Nikon
2004-03-23, 08:40:33
Original geschrieben von cope
Habt ihr die Grafik so bekommen oder hast du sie aus einer Aufgabenstellung heraus erstellt?
Wir haben die Grafik so bekommen. Die komplete Datenbank+Inhalt hat der Lehrer uns als Datei gegeben.
EDIT:
@Nagilum
Jo Bezirke haben zum Teil mehre Vertreter.

Crushinator
2004-03-23, 16:07:18
Theoretisch könnte es so funktionieren:

SELECT TOP 1 Vertreter.VNR AS Vertreter, Count(Kunden.KNR) AS Kundenzahl
FROM (Bezirke INNER JOIN Vertreter ON Bezirke.Bezname = Vertreter.Bezirk)
INNER JOIN Kunden ON Bezirke.Bezname = Kunden.Bezirk GROUP BY Vertreter.VNR
ORDER BY Count(Kunden.KNR) DESC

HellHorse
2004-03-23, 16:24:47
Ist SELECT TOP x SQL konform? :kratz:
Ich weiss bloss, dass es Postgres 7.4.1 nicht kann.
Dafür gibt es LIMIT das am Ende angehängt wird und das gleiche macht.

beta3
2004-03-23, 17:38:48
da wir schon bei SQL sind, ich hab eine sehr einfache frage (bin hier noch ein noob)

wie lautet der befehl um eine tabelle upzudaten
ich lade mir die tabelle auf meine lokale HDD und verändere sie, jetzt will ich die aktualisierte version hochladen

Crushinator
2004-03-23, 18:15:08
Original geschrieben von HellHorse
Ist SELECT TOP x SQL konform? :kratz: Nein, ist es leider nicht. Man kann sich außerhalb der T-SQL (Microsoft) basiernden Engines nur so helfen, daß man aus dem obigen SQL-Statement ohne "TOP 1" eine verschachtelte Unterabfrage bastelt, woraus man sich mit MAX(Kundenzahl) nur die entsprechenden Zeile(n) rausfischt, und weiderum mit sowas wie "SELECT VNR AS Vertreter FROM Vertreter WHERE Vertreter IN (<verschachtelte Unterabfrage>)" kombiniert.

Nach Fertigstellung der komplizierten und vermutlich auch nicht besonders performanten Abfrage stellt man nun fest, daß verschachtellte Unterabfragen entweder nicht überall unterstützt werden oder bei jedem anders im Syntax, und man landet letztendlich bei VIEWs, in der Hoffnung, daß man nicht auf eine DBMS stößt, welche keine VIEWs unterstützt... :D

/edit: Abgesehen davon, daß auch LIMIT nicht 100%ig standarisiert ist.

HellHorse
2004-03-23, 18:45:19
Original geschrieben von beta3
...
wie lautet der befehl um eine tabelle upzudaten

UPDATE
Original geschrieben von beta3
...
ich lade mir die tabelle auf meine lokale HDD und verändere sie, jetzt will ich die aktualisierte version hochladen
Was meinst du mit "ich lade mir die tabelle auf meine lokale HDD und verändere sie"?

HellHorse
2004-03-23, 18:51:48
@crushinator
Naja, man kann auch einfach statt "von Hand" "per Treiber" darauf zugreiffen und nur die ersten x rows verwenden :D
Oder nimmt eine andere proprietäre Erweiterung wie LIMIT. :(

Kann es sein, dass die Semantik davon irgendwie dem Konzept von relationaler Algebra entgegenläuft? Denn es heisst ja eigentlich nimm Zeilennummern 1 - n, aber es gibt ja keine wirklichen Zeilennummern.


Kommt wohl nicht so gut, wenn man eine SQL Aufgabe nicht in SQL löst. :grübel:

beta3
2004-03-23, 18:58:27
Original geschrieben von HellHorse
Was meinst du mit "ich lade mir die tabelle auf meine lokale HDD und verändere sie"?

ich lade den inhalt der tabelle runter und speichere sie als XML (oder *.mdb, etc.)
dann wird die tabelle offline verändert und danach sollte die aktualisierte version hochgeladen werden

HellHorse
2004-03-23, 19:10:54
Original geschrieben von beta3
ich lade den inhalt der tabelle runter und speichere sie als XML (oder *.mdb, etc.)
dann wird die tabelle offline verändert und danach sollte die aktualisierte version hochgeladen werden
Der einfache Weg ist die Tabelle zu leeren und alles neu einzufügen.
Alternativ kannst du für jede Änderung das entsprechende Query berechnen => viel Spass.
Oder du veränderst es direkt in der Datenbank.

beta3
2004-03-23, 19:13:13
Original geschrieben von HellHorse
Der einfache Weg ist die Tabelle zu leeren und alles neu einzufügen.
Alternativ kannst du für jede Änderung das entsprechende Query berechnen => viel Spass.
Oder du veränderst es direkt in der Datenbank.

ja, weil es ja lokal gespeichert ist, werde ich sicher die 1. variante nehmen (die 2. is ja ein witz ;D )
die 3. missfällt, da sie ja nur lokal verändert werden kann

kannst du mir bitte den befehl zum leeren nennen?

merci

Crushinator
2004-03-23, 19:18:36
Original geschrieben von HellHorse
Naja, man kann auch einfach statt "von Hand" "per Treiber" darauf zugreiffen und nur die ersten x rows verwenden :D ...was aber zu besonders spaßigen Laufzeiten und Datenmengen führt, wenn man extrem viele Vertreter und eben soviele Kunden hat. Dann muß man im Programm u.A. warten bis alle 3000 Vertreter aufgelistet sind. ;)

Oder nimmt eine andere proprietäre Erweiterung wie LIMIT. :( ...oder man implementiert je nach Engine die eine bzw. die andere Version. Das bevorzuge ich selbst, auch wenn ich den Nachteil des Mehraufwandes nicht von der Hand weisen kann.
Kann es sein, dass die Semantik davon irgendwie dem Konzept von relationaler Algebra entgegenläuft? Denn es heisst ja eigentlich nimm Zeilennummern 1 - n, aber es gibt ja keine wirklichen Zeilennummern. Die "Zeilennummer" ist doch nur virtuell und ergibt sich aus der Reihenfolge der Engine-intern selektierten Datensätze. Außerdem ist "SELECT TOP X" meines Erachtens so implementiert, daß es sogar mehr Datensätze zurückliefern würde, wenn die ORDER BY Bedingung auf mehrre Datensätze zutrifft als bei X angegeben. Letzteres hätte den Vorteil, daß man im aktuellen Fall auch mit "TOP 1" mehrere Vertreter rausbekäme, welche alle die höchste Menge an Kunden haben. =)
Kommt wohl nicht so gut, wenn man eine SQL Aufgabe nicht in SQL löst. :grübel: Ja, das auch. :D

Crushinator
2004-03-23, 19:22:47
Original geschrieben von beta3
kannst du mir bitte den befehl zum leeren nennen? stellvertretend antwortend: "DELETE FROM Tabelle"

HellHorse
2004-03-23, 19:54:27
Original geschrieben von crushinator
...was aber zu besonders spaßigen Laufzeiten und Datenmengen führt, wenn man extrem viele Vertreter und eben soviele Kunden hat. Dann muß man im Programm u.A. warten bis alle 3000 Vertreter aufgelistet sind. ;)

Ich würde sagen, das hängt von der Implentation des Treibers ab. Wenn z.B. Teiber erlaubt statt allen bloss die ersten x Rows zu lesen sollte das nicht soo schlimm sein.
Bei 30'000'000 schon eher ;)

Original geschrieben von crushinator
Die "Zeilennummer" ist doch nur virtuell und ergibt sich aus der Reihenfolge der Engine-intern selektierten Datensätze.

Ja schon, aber mir fällt trotzdem kein Weg ein, das in RA zu lösen.
Original geschrieben von crushinator
Außerdem ist "SELECT TOP X" meines Erachtens so implementiert, daß es sogar mehr Datensätze zurückliefern würde, wenn die ORDER BY Bedingung auf mehrre Datensätze zutrifft als bei X angegeben. Letzteres hätte den Vorteil, daß man im aktuellen Fall auch mit "TOP 1" mehrere Vertreter rausbekäme, welche alle die höchste Menge an Kunden haben. =)

Was bei LIMIT definitv nicht der Fall ist.

@beta3
Nein, das war kein Witz.
Warum überhaupt lokal speichern? Da kannst du dir die DB ja gleich schenken.
Hast du dir schon mal überlegt, was passiert wenn in der Zwischenzeit jemand die Daten in der DB ändert?

Crushinator
2004-03-24, 02:17:09
Original geschrieben von HellHorse
Ich würde sagen, das hängt von der Implentation des Treibers ab. Wenn z.B. Teiber erlaubt statt allen bloss die ersten x Rows zu lesen sollte das nicht soo schlimm sein. Bei 30'000'000 schon eher ;)
So eine Treiberimplementierung bzw. Option, nämlich "server based cursor" zu verwenden hat den Nachteil, daß es nur bei geringen Rückgabemengen Sinn macht, da das Bewegen des "Cursor" zu den nächsten/vorigen Datensätzen in der Praxis - wegen den anfallenden Synchronisationen zwischen Client und Server - oft zu hohen Latenzen führt. Unserem Fall wäre es allerdings dienlich, da man die gesuchte Information voraussichtlich in den ersten Zeilen vorfinden würde.

Ich stelle übrigens fest, daß wir beide scheinbar verschiedene Vorstellungen davon haben, was "spaßig" im Bezug auf Laufzeiten und Datenmengen bedeutet. Meine Vorstellung geht von akzeptablen Gesamtantwortzeiten (Query + Logik) in Richtung 500 ms bis max. 1000 aus, was in unserem speziellen Falle bereits mit 3000 Vertretern und durchschnittlichen 500 Kunden pro Bezirk nicht unbedingt eingehalten werden dürfte. :D

beta3
2004-03-24, 14:39:27
Original geschrieben von HellHorse
@beta3
Nein, das war kein Witz.
Warum überhaupt lokal speichern? Da kannst du dir die DB ja gleich schenken.
Hast du dir schon mal überlegt, was passiert wenn in der Zwischenzeit jemand die Daten in der DB ändert?

so habe ich es mir gedacht:
wenige leute haben zugriff auf die DB (Lese- u. Schreibrechte)
sie wird 2mal lokal gespeichert, eine sicherheitskopie und eine zu verändern
nach dem verändern wird mithilfe der sicherheitskopie gecheckt ob sie verändert wurde,
wenn nicht -> normal hochladen
wenn schon -> den nutzer wissen lassen, unterschiede zw. aktualisierter und sicherheitsversion anzeigen, vl auch exportieren (damit nicht alles neugeschrieben werden muss), und dann wird die neue version im inet runtergeladen


ich will sie offline editierbar machen, weil es praktischer und bequemer ist und damit die nutzer die daten auch z.b. während einem flug ändern können


wenn du ne bessere idee hast, bitte sag sie

grakaman
2004-03-25, 11:26:52
Original geschrieben von beta3
ja, weil es ja lokal gespeichert ist, werde ich sicher die 1. variante nehmen (die 2. is ja ein witz ;D )
die 3. missfällt, da sie ja nur lokal verändert werden kann

kannst du mir bitte den befehl zum leeren nennen?

merci

Das ist totaler _Unsinn_! Beschäftige dich mal mit dem DataSet. Dort werden nämlich alle Änderungen protokolliert und du kannst auf äußerst einfache Art und Weise deine Daten synchronisieren.

grakaman
2004-03-25, 11:37:46
Original geschrieben von HellHorse
@beta3
Nein, das war kein Witz.
Warum überhaupt lokal speichern? Da kannst du dir die DB ja gleich schenken.


Um hochskalierbare Anwendungen zu realisieren?

HellHorse
2004-03-25, 13:34:06
@beta3
Kommt darauf an, wie lange editieren im Schnitt braucht, wieviele Nutzer eine Standleitung haben, welchen Teil der Editierzeit im Flugzeug verbracht wird, wie oft und wie viel editiert wird, wie gut dein diff/merge ist,....