Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Unterabfragen

Begonnen von ElkeS, Juli 15, 2015, 10:04:10

⏪ vorheriges - nächstes ⏩

ElkeS

Hallo,
hab ein Problem mit Abfragen:
ich möchte außer der Abfrage nach den letzten eingegebenen Werten auch die Anzahl der schon eingegebenen Werte haben.
Also letzter Wert über folgenden Befehl:

SELECT *
FROM tblWeight2015
WHERE (tblWeight2015.bytWeightID)=(
SELECT Top 1 temp.bytWeightID
FROM tblWeight2015 as temp
WHERE temp.bytMasterID=tblWeight2015.bytMasterID
ORDER by temp.datWeight desc
);

...funktioniert perfekt! Nun aber noch die Anzahl der Gewichtsmessungen? Geht das nur über eine Extraabfrage oder lässt sich das auch mit einer Unter-(Unter)- abfrage erledigen?
Nächste Frage:
Ich habe eine Abfrage – sie basiert auf 4 Tabellen und 6 Abfragen (eben solchen, wie oben beschrieben) und daraus wird eine Bericht (Etikett) generiert zum Ausdrucken. Nun dauert mir die Berichtsgenerierung zu lange. Kann man da etwas optimieren? – oder müssen die Abfragen anders gestellt werden.
Gruß ElkeS

MaggieMay

Hi,

kann es sein, dass du folgendes meinst:
SELECT *, (Select Count(*) From tblWeight2015 As h Where h.bytMasterID=tblWeight2015.bytMasterID) As anz
FROM tblWeight2015
WHERE (tblWeight2015.bytWeightID)=(
SELECT Top 1 temp.bytWeightID
FROM tblWeight2015 as temp
WHERE temp.bytMasterID=tblWeight2015.bytMasterID
ORDER by temp.datWeight desc
);
Freundliche Grüße
MaggieMay

ElkeS

...meinte ich – genauso soll es sein! Vielen, vielen Dank – das bringt mich wieder ein ganzes Stück weiter...jetzt habe ich auch die Syntax verstanden! Im Prinzip sind es jetzt 2 Unterabfragen – eine zum Heraussuchen des maximalen Datums und eine zum Zählen – zusammen in einer Abfrage. Ich hatte versucht in der Unterabfrage nach dem MaxDatum – die Zählabfrage unterzubringen –
Nun werde ich meine Abfragen anpassen und sehen, ob sich mit der Zeit zur Berichtserstellung auch etwas tut...
Nochmals vielen Dank!
ElkeS

ElkeS

Hallo,
SELECT *, (
Select Count(*) From tblIndivTests2015 As h Where h.bytMasterID=tblIndivTests2015.bytMasterID) As anz
FROM tblIndivTests2015
WHERE (tblIndivTests2015.bytIndivTestsID)=(
SELECT Top 1 temp.bytIndivTestsID
FROM tblIndivTests2015 as temp
WHERE temp.bytMasterID=tblIndivTests2015.bytMasterID
ORDER by temp.datStart desc
);

Fehlermeldung:

Höchstens ein Datensatz kann von dieser Unterabfrage zurückgegeben werden.

...was passiert da? Warum klappt das bei einer Tabelle und bei der nächsten Tabelle nicht?
Bin etwas ratlos? Habe die Tabellen überprüft, habe den Code kontrolliert...
Gruß ElkeS

DF6GL

Hallo,

ich denke mal, die ganze SQL-Konstruktion liesse sich über eine Gruppierende Abfrage ohne Unterabfragen eleganter lösen...aber ich kenne jetzt nicht die genauen Vorgaben...


Versuch mal so:


SELECT *,
(
    Select Count(*) From tblIndivTests2015 As h Where h.bytMasterID=tblIndivTests2015.bytMasterID
)   As anz
FROM tblIndivTests2015 WHERE tblIndivTests2015.bytIndivTestsID IN
     (
       SELECT Top 1 temp.bytIndivTestsID FROM tblIndivTests2015 as temp WHERE
temp.bytMasterID=tblIndivTests2015.bytMasterID
ORDER by temp.datStart desc
     )

Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

ElkeS

Hallo,

danke! Jetzt scheint (?) es zu funktionieren. Eine elegantere Lösung mit Gruppierung ohne Unterabfrage? Ich brauche aber auch den ganzen Satz zum letzten Datum (also alle Werte zum letzten Datum)?

Gruß ElkeS

ebs17

Wenn ich das richtig verstanden habe:
SELECT
   T.*,
   U.AE
FROM
   (
      SELECT
         bytWeightID,
         bytMasterID,
         MAX(datWeight) AS MaxDate,
         COUNT(*) AS AE
      FROM
         tblWeight2015
      GROUP BY
         bytWeightID,
         bytMasterID
   ) AS U
      INNER JOIN tblWeight2015 AS T
      ON U.bytWeightID = T.bytWeightID
         AND
      U.bytMasterID = T.bytMasterID
         AND
      U.MaxDate = T.datWeight


ZitatNächste Frage:
Ich habe eine Abfrage – sie basiert auf 4 Tabellen und 6 Abfragen (eben solchen, wie oben beschrieben) und daraus wird eine Bericht (Etikett) generiert zum Ausdrucken. Nun dauert mir die Berichtsgenerierung zu lange. Kann man da etwas optimieren? – oder müssen die Abfragen anders gestellt werden.
Ja und Ja.
Mit freundlichem Glück Auf!

Eberhard

ElkeS

Hallo zurück,
habe es angepaßt:

SELECT  T.bytMasterID, T.datWeight, T.dblWeight, U.AE
FROM (
SELECT bytMasterID, MAX(datWeight) AS MaxDate, COUNT(*) AS AE
FROM tblWeight2015
GROUP BY bytMasterID
) AS U
INNER JOIN tblWeight2015 AS T
ON U.bytMasterID = T.bytMasterID AND U.MaxDate = T.datWeight

läuft gut und ist wesentlich schneller als die andere Variante! Ich werde meine anderen Abfragen auch verändern und sehen ob mir das als Optimierung schon reicht oder gibt es noch etwas Besseres? "Ja und Ja" ?
Gruß ElkeS


ebs17

Zitatoder gibt es noch etwas Besseres?

Das kommt darauf an:
- Datenmengen,
- vorhandene Tabellenstrukturen,
- das Abfrageziel,
- Indizierung (Entwickleraufgabe).

Daraus kann man dann Abfragedesign ableiten, gerne auch in Varianten, um vergleichen zu können.

Zitatwesentlich schneller als die andere Variante
Die Unterabfrage im FROM-Teil wird nur einmal ausgeführt, während Unterabfragen im WHERE-Teil und ganz besonders im SELECT-Teil mehrfach (bis einmal pro Datensatz der Hauptabfrage) ausgeführt werden.
Siehe dazu auch Grundlagen - SQL ist leicht ( 8 ) - Index.
Mit freundlichem Glück Auf!

Eberhard