August 13, 2022, 20:34:08

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


Union Abfrage mit Sortierung

Begonnen von Parasolid, Juli 08, 2022, 06:51:58

⏪ vorheriges - nächstes ⏩

Parasolid

Hallo zusammen,

ich bin leider noch neu im Thema und habe ein Problem mit einer Abfrage. Ich möchte aus einer Tabelle Chargen die Wassermenge abrufen. Nach ID sortiert die letzten 20 Werte für Maschine 1 und Rezept 1. Das ist auch kein Problem. Die Abfrage soll aber ergänzt werden um Maschine 2 und Rezept 1, ebenfalls nach ID sortiert die letzten 20 Werte.
Also dachte ich einfach Abfrage kopieren, anpassen und mit UNION verbinden. Allerdings sortiert er bei der zweiten Abfragehälfte nicht nach ID?

SELECT TOP 20 [ChargenID], [Wasser]
FROM Chargen
WHERE [RezeptNr]=1 AND [Maschine]=1
ORDER BY [ChargenID] DESC

UNION SELECT TOP 20 [ChargenID], [Wasser]
FROM Chargen
WHERE [RezeptNr]=1 AND [Maschine]=2
ORDER BY [ChargenID] DESC

ebs17

Juli 08, 2022, 08:04:44 #1 Letzte Bearbeitung: Juli 08, 2022, 08:29:04 von ebs17
Vergleiche grundlegende Syntax des SELECT-Befehls:
Sortierenanweisungen in den Teilabfragen einer UNION-Abfrage werden nicht berücksichtigt, nur die allerletzte. Das beißt sich mit den TOP-X-Gestaltungen, die ihrerseits funktionell eine Sortierung benötigen.

Ich sehe zwei Auswege:

1) Prozesse voneinander trennen
SELECT
   T1.ChargenID,
   T1.Wasser
FROM
   (
      SELECT TOP 20
         ChargenID,
         Wasser
      FROM
         Chargen
      WHERE
         RezeptNr = 1
            AND
         Maschine = 1
      ORDER BY
         ChargenID DESC
   ) AS T1
UNION ALL
SELECT
   T2.ChargenID,
   T2.Wasser
FROM
   (
      SELECT TOP 20
         ChargenID,
         Wasser
      FROM
         Chargen
      WHERE
         RezeptNr = 1
            AND
         Maschine = 2
      ORDER BY
         ChargenID DESC
   ) AS T2
Hier kannst Du noch eine Sortierenanweisung für die äußere Darstellung anfügen.

2) Statt UNION würde ich aber tendenziell auf so etwas setzen (ungetestet)
SELECT
   T1.ChargenID,
   T1.Wasser,
   T1.Maschine
FROM
   Chargen AS T1
WHERE
   T1.Maschine IN (1, 2)
      AND
   T1.ChargenID IN
      (
         SELECT TOP 20
            T2.ChargenID
         FROM
            Chargen AS T2
         WHERE
            T2.RezeptNr = 1
               AND
            T2.Maschine = T1.Maschine
         ORDER BY
            ChargenID DESC
      )
Dabei ist unterstellt, dass ChargenID in der Tabelle eindeutig ist.
Mit freundlichem Glück Auf!

Eberhard

Parasolid

Der obere Code von dir funktioniert. Vielen Dank dafür!
Bei der unteren Variante rechnet Access Ewigkeiten, bringt dann aber auch das Ergebnis.

ebs17

rechnet Access EwigkeitenEine sinnvolle Indizierung in der Tabelle setze ich als selbstverständlich voraus.
Mit freundlichem Glück Auf!

Eberhard