Neuigkeiten:

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

Mobiles Hauptmenü

Abfrage zum Löschen doppelter Datensätze, aber einer muss übrigbleiben

Begonnen von Debus, Februar 22, 2023, 12:46:27

⏪ vorheriges - nächstes ⏩

Debus

Hallo,

ich habe hier folgendes Problem. Ich habe einen Import mit einer Datei, die aus unserm Großrechner kommt. Hier gibt es pro Kennung x Datensätze, was daher kommt, das wir Pro Kennung bis zu 99 Arbeitsgebiete vergeben können(vertikal). Dazu noch bis zu 99 Vorgangsarten Horizontal pro Arbeitsgebiet.
Daher kann also eine Kennung bis zu 99 mal vorkommen. Ich brauche aber eine Abfrage, wo die Felder Kennung; B-Typ-GS; B-Typ-HAG B-Typ-NR und AG enthalten sind, diese aber ebend nur einmal pro Kennung. Hinzu kommt noch, dass ich aus einer anderen Tabelle den Klartext zum Feld B-Typ-NR hinzufügen möchte. Wenn ich die SQL laufen lasse ohne das Hinzufügen des Klartextes geht es aber wenn ich den Klartext hinzufüge bekomme ich die Datensätze x mal.  Was muss ich hier machen?

Bei der Abfrage begrenze ich direkt auf die GS01 und das HAG 55 weil ich nur danach filtern muss.


SELECT
AGVA.Kennung,
AGVA.[B-Typ-GS],
AGVA.[B-Typ-HAG],
AGVA.[B-Typ-Nr],
[B-Typ].Bezeichnung

FROM
AGVA INNER JOIN [B-Typ] ON (AGVA.[B-Typ-HAG] = [B-Typ].AG) AND (AGVA.[B-Typ-Nr] = [B-Typ].[B-TYP-Nr])

WHERE
(((AGVA.[B-Typ-GS])=1) AND ((AGVA.[B-Typ-HAG])=55) AND (([B-Typ].Bezeichnung) Like "*Reg*"));

Was muss ich hier verändern? Dass halt immer nur einmal die Kennung gezeigt wird und die anderen DS wegfallen.


Danke und wenn es unverständlich ist, dann versuche ich es auch gerne noch anders zu beschreiben.

DD

Beaker s.a.

@DD
1. Zeige ein Bild des Datenmodells (Datenbanktools -> Beziehungen)
2. Suche hier oder im Schwesterforum nach dem Begriff "Aufzählungsfelder",
und lies, was dazu geschrieben steht.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

ebs17

ZitatDass halt immer nur einmal die Kennung gezeigt wird und die anderen DS wegfallen.
Du musst nur im Datensatz ein Merkmal haben, das pro Kennung nur einmal auftritt. Dann kannst Du darauf filtern.
Mit freundlichem Glück Auf!

Eberhard

Debus

Hallo,

@ekkehard
Es gibt hier kein Datenmodell, da ich die Ergebnisse nachher wieder im Großrechner verarbeiten muss. Nur da kann man halt nicht Filtern.
Ich habe nochmal die Tabellen und die Abfrage als Bilder angehangen.
Mit Aufzählungsfeldern meinst Du da das gleiche wie Eberhard? oder was genau. Wenn ich danach gegoogelt oder hier im Forum geschaut habe, finde ich nichts was auf mein Problem passen würde.



@Eberhard
Zitat von: ebs17 am Februar 22, 2023, 18:23:58
ZitatDass halt immer nur einmal die Kennung gezeigt wird und die anderen DS wegfallen.
Du musst nur im Datensatz ein Merkmal haben, das pro Kennung nur einmal auftritt. Dann kannst Du darauf filtern.


Ich habe hier leider kein Feld was es pro Kennung nur einmal gibt außer halt den Namen der Kennung.

Daher fällt das leider flach.

Trotzdem schonmal danke

DD

ebs17

ZitatIch habe hier leider kein Feld
Man könnte ja schlicht ein Autowert-Feld ergänzen und von solch einer ID immer den Minimalwert nehmen, also immer den ersten nehmen. Ob das sachlich einen Sinn gibt, ist eine andere Frage.

Du könntest auch schlicht per DISTINCT gruppieren und da alle Felder aus der SELECT-Liste rauswerfen, die bei einer Vereinzelung stören.
Mit freundlichem Glück Auf!

Eberhard

Debus

Guten Morgen,

Ein Autowert Feld hinzuzufügen ist kein Problem aber wie muss dann die Abfrage aussehen, dass er da immer nur den kleinsten Wert pro Kennung nimmt?


Das mit dem DISTINCT hatte ich schon ausprobiert, bringt aber nicht das Ergebnis. :=(

Aber vielleicht kannst Du mir ja mal kurz zeigen wie das mit dem kleinsten Wert gehen würde bei einer Abfrage.

Danke und einen schönen Tag
DD

Debus

Hallo, habe das mal versucht mit dem Min hinzubekommen, ist aber auf ganzer Linie gescheitert.

In Abb 2.jpg sieht man den Versuch der Abfrage

In Abb 1.jpg sieht man den Tabelleninhalt AGVA (hier sind alle Kennungen x mal enthalten

In Abb 3.jpg sieht man das Ergebnis ohne den Zusatz Min  -  hier wird die Bezeichnung richtig abgebildet.

In Abb 4.jpg sieht man das Ergebnis mit dem Zusatz Min   -  hier wird auch immer noch jede Kennung x mal aufgelistet, aber auch der Inhalt des Bezeichnungsfeldes ist kryptisch.

Sorry, ich weiß hier wirklich nicht wie ich das angehen kann.

DD

ebs17

SELECT
   AGFA.ID,
   AGVA.Kennung,
   AGVA.[B-Typ-GS],
   AGVA.[B-Typ-HAG],
   AGVA.[B-Typ-Nr]
FROM
   AGVA
      INNER JOIN
         (
            SELECT
               Kennung,
               MIN(ID) AS MinID
            FROM
               AGVA
            GROUP BY
               Kennung
         ) AS M
         ON AGVA.Kennung = M.Kennung
            AND
         AGVA.ID = M.MinID
Das ist die Behandlung der einen Tabelle. In dieser Abfrage kannst Du nun die Verknüpfung zu anderen Tabelle sowie die zusätzlichen Filter ergänzen.
Mit freundlichem Glück Auf!

Eberhard

Debus

Hallo Eberhard,

danke dafür, die Bezeichnung muss ich allerdings wirklich in einer zweiten Abfrage dranhängen, da ansonsten werden wieder alle mehrfach aufgeführt und die Bezeichnung ist wie im Bild gezeigt kaputt. Aber egal lasse ich einfach zwei hintereinander laufen!.

Danke
DD