Maria05 Geschrieben 17. November 2005 Teilen Geschrieben 17. November 2005 Hallo, ich bräuchte Hilfe bei meiner SQL-Abfrage. Ich sitze schon eine ganze Weile davor und komme leider nicht weiter. Ich habe drei Tabellen: Kennzahlen, Ziele und Istwerte. Wobei die Zieltabelle mit der Kennzahltabelle über die Zielnummer verknüpft ist und die Kennzahltabelle wiederum mit der Istwerttabelle über die Kennzahlnummer. Ist der Istwerttabelle werden jeweils neue Istwert mit dem dazugehörigem Datum und der Kennzahlnummer gespeichert. Dadurch gibt es zu jeder Kennzahl mehrere Istwerte. Nun hätte ich gerne eine Abfrage, die über alle drei Tabellen geht und zudem für jede Kennzahl nur den aktuellsten Istwert liefert. Einzeln kann ich die Abfragen erstellen, aber ich bekomme sie nicht verknüpft. Ich wäre überglücklich, wenn mir jemand auf die Sprünge helfen könnte. Liebe Grüße Maria05 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ipu Geschrieben 18. November 2005 Teilen Geschrieben 18. November 2005 Hi, also angenommen, es handelt sich um das DBMS ACCESS in welcher Version auch immer, mußt du zuerst aus der Istwerte-Tabelle zu allen Kennzahlen das aktuellste Datum raussuchen und dann in einem zweiten Schritt diese Abfrage zugrunde legen und aus den anderen Tabellen zu den Kennzahlen aus der Abfrage die restlichen Werte suchen lassen. Das geht dann entweder über einen JOIN oder über WHERE Kennzahl = Kennzahl etc. Grüße von ipu Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
baba007 Geschrieben 18. November 2005 Teilen Geschrieben 18. November 2005 select * was auch immer from zieltabelle (oder was auch immer du brauchst) where referenznummer (oder was auch immer ) IN (select * from bla bla where irgendwas in (select * from bla bla )) usw. System verstanden ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dimikar Geschrieben 20. November 2005 Teilen Geschrieben 20. November 2005 Hallo Maria05, ein möglicher Lösungsansatz ist die drei Tabellen über die genannte Keys zu Joinen und nach den gesuchten Kriterien zu gruppieren. Etwa wie folgend: Ich versuche erst mal deine Beschreibung tabellarisch darzustellen, bin mir nicht ganz sicher was Du für Felder hast aber ich denke wird so ähnlich sein Kennzahlen kz_NR ... kz_Text Ziel_NR Ziele Ziel_NR ... ziel_Text IstWerte IW_NR IW_Datum ... kz_NR So in etwa sieht dann eine Abfrage auf die drei Tabellen aus, select k.kz_NR,k.Ziel_NR,z.ziel_text,k.kz_text,max(i.IW_Datum) from Kennzahlen k,Ziele z,IstWerte i where k.kz_NR = i.kz_Nr and z.Ziel_NR = k.Ziel_NR group by k.kz_NR,k.Ziel_NR,z.ziel_text,k.kz_text Da werden einige Infofelder zu dem jeweils aktuellsten Datum für jedes Kennzeichen selektiert. Ich gehe davon aus dass die genante Schlüssel PK-FK Paare und Pflichtfelder sind. Wenn nicht dann muss Du Outer-Joins verwenden um die NULL-Wert Sätze mitzunehmen. Wenn Du in deinerAbfrage andere Felder haben willst muss Du stets die group by Bedingung analog ändern. So jetzt höre ich auf in meine Kristalkugel zu schauen und wünsche ich Dir Viel Spaß beim experimentieren. Liebe Grüße Dimitris Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maria05 Geschrieben 25. November 2005 Autor Teilen Geschrieben 25. November 2005 Hallo, Vielen lieben Dank für eure Hilfe. Ich habe eure Vorschläge ausprobiert. Leider bin ich bis jetzt erfolglos gewesen. Die Variante mit dem In-Schlüsselwort funktioniert nicht, weil ich da die Fehlermeldung erhalte, dass die Unterabfrage mehr als ein Ergebnis zurück liefert. Mit dem "Group by" erhalte ich immerhin ein Ergebnis, aber leider bekomme ich zu viele Datensätze zurück. Ich habe es mit dem Access-Generator geschafft und das gewünschte Ergebnis erhalten. Mein Problem ist jetzt aber, dass ich zwei Abfragen habe, die ich nicht verknüpft bekomme. (Ich konnte mir ja den SQL-Code anzeigen lassen und in auf dem SQL-Server ausprobieren.) Ich starte erst eine Abfrage und erfrage für jede Kennzahlnummer den aktuellen Istwert. Mit dem Ergebnis dieser Abfrage starte ich dann eine zweite Abfrage, d.h. das die zweite Abfrage Werte aus der ersten Abfrage nutzt. Wie schon gesagt klappt es in Access, da ich ja die erste Abfrage gespeichert habe. Ich bräuchte den SQL-Code aber um die Abfrage in mein VB-Programm einzufügen. Habt ihr noch eine Idee? Vielen Dank im vorraus für eure Geduld. Ich bin was Abfragen angeht leider keine große Leuchte. Liebe Grüße Maria05 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dimikar Geschrieben 27. November 2005 Teilen Geschrieben 27. November 2005 Hallo, wenn ich das richtig verstanden habe hast Du jetzt eine Abfrage in Access gespeichert die das tut was Du willst. Wenn es jetzt darum geht diese als SQL-Code zu sehen, Du öffnest die Abfrage mit einem Doppelklick und dann einfach die SQL-Ansicht auswählen. Das geht z.B mit dem ersten Button in der Toolbar von Access oben links.Beim draufklicken, klappt ein Dropdown Menü herunter und ein Auswahl unter vielen ist die SQL-Ansicht. Poste mal die SQL-Befehle die Du mit dem Wizard erzeugt hast. Vielleicht fällt mir dann was dazu ein. Der vollständigkeit halber würde ich dir bitten auch die beiden SQL-Abfragen die Du abgesetzt hast aber nicht so gefunkt haben wie Du wolltest hier zu Posten (die von mir und die von baba007). Ich könnte dann den einen oder anderen Tipp geben. Ich bin ehrlich gesagt etwas überascht über die Ergebnisse die Du beschreibst. Mit dem "Group by" erhalte ich immerhin ein Ergebnis, aber leider bekomme ich zu viele Datensätze zurück. Die "group by" Variante liefert nämlich stets nur einen Satz pro gesuchte Gruppe. und Die Variante mit dem In-Schlüsselwort funktioniert nicht, weil ich da die Fehlermeldung erhalte, dass die Unterabfrage mehr als ein Ergebnis zurück liefert. Hier muss ein anderer Fehler vorliegen da der IN schlüssel dafür gebaut ist einen Wert in eine Gruppe von mehreren Werten zu suchen. Also ich empfehle Dir (ohne dir zu nahe tretten zu wollen ) erst mal dich mit den DML-Part von SQL ein Bisschen mehr zu beschäftigen. Wenn Du mit Datenbanken arbeiten musst dann ist es nun mal unerlässlich. Dazu kann ich Dir ein kleines Buchlein aus der "Grundcurs Comptuterpraxis"-Reihe vom RoRoRo Verlag empfehlen. Es heisst (was für eine Überaschung ) SQL. Ist von G.Kuhlmann und F.Müllmerstadt. Es ist sehr kompakt(330 Seiten kleine Schrift) und beinhaltet alles rund um SQL mit der Bessonderheit dass die Unterschiede zwischen Jet-Engine(Access),Oracle,DB2 und Informix erleutert werden. Es Kostet so um die 10,- Euro. Dieses SQL-Bibelchen solltest Du durcharbeiten zumindest den DML-Abschnitt. Dann werden viele Sachen mit der Zeit klarer. Viele Grüße Dimitris Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maria05 Geschrieben 27. November 2005 Autor Teilen Geschrieben 27. November 2005 Hallo, vielen Dank für deine zahlreichen Bemühungen. Du öffnest die Abfrage mit einem Doppelklick und dann einfach die SQL-Ansicht auswählen. Das geht z.B mit dem ersten Button in der Toolbar von Access oben links.Beim draufklicken, klappt ein Dropdown Menü herunter und ein Auswahl unter vielen ist die SQL-Ansicht. Vielen Dank für den Tipp, aber da bin auch schon draufgekommen. Ich habe mir den SQL-Code von dort geschnappt und auf dem SQL-Server versucht zuverknüpfen. Dabei habe ich mich aber etwas ungeschickt angestellt. Die "group by" Variante liefert nämlich stets nur einen Satz pro gesuchte Gruppe. Entschuldigung, da hab ich mich wohl etwas ungeschickt ausgedrückt. Natürlich liefert die Abfrage nur einen Datensatz pro Gruppe zurück. Das Problem ist leider, dass zuviele Gruppen gebildet werden. Hier mal meine Abfrage: SELECT Nr, Kennzahltitel, Ziele.ZielNr, Zieltitel, Ist, Max(Datum) as [Datum] from Kennzahlen, Ziele, Istwert group by Nr, Kennzahltitel, Ziele.ZielNr, Zieltitel, Ist Hier muss ein anderer Fehler vorliegen da der IN schlüssel dafür gebaut ist einen Wert in eine Gruppe von mehreren Werten zu suchen. Hier muss ich dir schon wieder zustimmen. Laut dem was ich vorher gelesen hatte müßte es funktionieren. Meine Abfrage: SELECT * from Ziele where ZielNr in (SELECT * from Kennzahlen where Nr in (SELECT * from Istwert where Kennzahlen.Nr=KNr and KNr in (SELECT Max(Datum) as [Datum], KNr from Istwert group by KNr))) Danke auch für das Buch, ein bißchen mehr Theorie schadet nie. Das was ich bis jetzt gelesen habe, hat mir zwar Joins, Where-Klauseln, Aggregatfuntkionen. usw. erklärt. Aber als ich das jetzt anwenden sollte.............. Da hatte ich dann meine Probleme. Ich vermute schon fast, dass mir dafür irgendwie die Gehirnwindungen fehlen ;-). Viele Grüße Maria05 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dimikar Geschrieben 27. November 2005 Teilen Geschrieben 27. November 2005 Hallo Maria05, Kopf hoch. Keiner ist mit angeborenem Wissen in die Welt gekommen.Wie es so schön heißt 'Die Übung macht den Meister'. Ich habe ja auch ein paar Jährchen Berufserfahrung um da einigermaßen durchblicken zu können . Aber die Theorie muss Du immer wieder auffrischen nur dann kannst Du die in der Praxis zielsicherer anwenden. Ein paar letzte Anmerkungen zu deiner Abfragen hätte ich aber doch noch :floet: Zitat von Maria05 Meine Abfrage: SELECT * from Ziele where ZielNr in (SELECT * from Kennzahlen where Nr in (SELECT * from Istwert where Kennzahlen.Nr=KNr and KNr in (SELECT Max(Datum) as [Datum], KNr from Istwert group by KNr))) Diese Abfrage kann so nicht funktionieren da die Subselects viel mehr Felder zurückliefern (Du selektierst ja mit * alle Felder) als du in deiner Bedingungen abfragst. Eine Subselectabfrage, die Teil einer IN-Bedingung ist,muss stets nur ein Feld zurückliefern. Ich würde Dir aber von Subselect-Joins generell abraten. Die sind kompliziert, nur in seltenen Fällen sinnvoll und wenn man die nicht effizient formuliert sehr resourcenhungrig. Zitat von Maria05 SELECT Nr, Kennzahltitel, Ziele.ZielNr, Zieltitel, Ist, Max(Datum) as [Datum] from Kennzahlen, Ziele, Istwert group by Nr, Kennzahltitel, Ziele.ZielNr, Zieltitel, Ist Hier liegt hoffentlich ein Copy-Paste Fehler vor. Die where Klausel fehlt nämlich komplet. Wenn die Abfrage doch so abgesetzt wurde, dann hast Du ein kartesisches Produkt erzeugt. Das würde natürlich die erhöhte Anzahl der zurückgelieferten Sätzen erklären. Ausserdem empfehle ich immer für alle gejointe Tabellen einen Alias-Namen zu benutzen und die selektierte Felder mit der <Aliasname>.Feld schreibweise anzusprechen. Das bringt mehr Überblick und meidest Du Nebeneffekte falls gleichnamige Felder selektiert werden. Schau Dir vielleicht meine erste Antwort in diesem Thread noch mal an. Viele Grüße aus München Dimitris Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.