AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken C# [Erledigt] SELECT DISTINCT und JOIN - Redundanzen verringern
Thema durchsuchen
Ansicht
Themen-Optionen

[Erledigt] SELECT DISTINCT und JOIN - Redundanzen verringern

Ein Thema von Jürgen Thomas · begonnen am 21. Okt 2007 · letzter Beitrag vom 21. Okt 2007
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#11

Re: SELECT DISTINCT und JOIN - Redundanzen verringern

  Alt 21. Okt 2007, 14:19
Zitat von Jürgen Thomas:
die ID ist ja eindeutig, und die will ich behalten.
und
Zitat von Jürgen Thomas:
Code:
  STR_ID STR_NR  STATUS NAME_SORT       NAME46             NAME22
---------------------------------------------------------------------
     837     1     S      AGASTR          Agastr.           Agastr.
     838     1     G      AGATHAGASSE     Agathagasse       Agathagasse
     839     1     G      AGATHAPLATZ     Agathaplatz       Agathaplatz
     840     1     S      AGATHARIEDERSTR Agatharider Str.  Agatharider Str.
     840     1     G      AGATHARIEDERSTR Agatharieder Str. Agatharieder Str.
     841     1     G      AGATHASTR       Agathastr.        Agathastr.
     841     2     G      AGATHASTR       Agathastr.        Agathastr.
     841     3     G      AGATHASTR       Agathastr.        Agathastr.
     841     4     G      AGATHASTR       Agathastr.        Agathastr.
     841     5     G      AGATHASTR       Agathastr.        Agathastr.
     841     6     G      AGATHASTR       Agathastr.        Agathastr.
     842     1     G      AGATHAWEG       Agathaweg         Agathaweg
     843     1     G      AGATHELASCHWEG  Agathe-Lasch-Weg  Agathe-Lasch-Weg
widerspricht sich. Ich erkenne da keine eindeutige ID, sondern eher sowas, dass es für eine ID (z.B. 840) unterschiedliche Schreibweisen für die Strassennamen gibt. Es handelt sich aber wohl um ein und die gleiche Strasse.

Und wenn ich dein nun endlich richtig verstanden hab, willst du für jede ID (837-843) jeweils einen einzigen Datensatz in deine Zieltabelle schreiben. Welcher, scheint dir egal zu sein... Da wird dir also nix anderes übrig bleiben, als DS für DS zu durchlaufen, sortiert nach ID, und sobald du eine neue ID erhälst, schreibst du den DS in deine Zieltabelle. Anders wird das wohl nicht klappen.
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#12

Re: SELECT DISTINCT und JOIN - Redundanzen verringern

  Alt 21. Okt 2007, 14:29
Zitat von mkinzler:
Vielleicht sollte man auch mal das Schema richtigstellen. Welche Bedeutung ahben die verchiedenen Namen?
Die Datenstruktur ist von der Post vorgegeben. Die Quelldatei ist eine Textdatei (feste Feld- und Satzlängen) mit 150 MB. Ich will sie in mehrere Tabellen in einer "richtigen" Datenbank übernehmen.
  • Str_ID ist die bundesweit eindeutige laufende Nummer zu einem Straßennamen.
  • Str_Nr ist die laufende Nummer für alle Straßen mit gleichem Namen.
  • Name_Sort ist die eindeutige, sortierbare Bezeichnung.
  • Name46 ist die "lange", normale Schreibweise mit max. 46 Zeichen.
  • Name22 ist eine Verkürzung mit max. 22 Zeichen für den Fall, dass ein Adressenfeld nicht lang genug ist.
  • Status = 'G' sind gültige Straßennamen. Andere Werte 'W', 'S', '1' usw. verweisen darauf, dass der Straßenname in diesem Ort korrigiert oder geändert wurde.
Zitat:
Was bezweckst du mit der Abfrage (zu was die 2. Tabelle)?
Redundanzen vermeiden, vor allem wegen der drei Schreibweisen: Die Königsberger Straße gibt es 172x, eine Friedrich-Ebert-Str. 188x und eine Gartenstraße 285x.

Da ich (anders als die Post-Textdatei) mit einer relationalen DB arbeite, brauche ich sowieso getrennte Nachschlagetabellen mit einem PrimaryKey. Da bietet sich eine Tabelle "Straßennamen" an. Jürgen

@Jelly
Das, was Du zitiert hast, ist die Quelltabelle. "... jeweils einen einzigen Datensatz in deine Zieltabelle schreiben. Welcher, scheint dir egal zu sein..." Nicht ganz egal (ich bevorzuge Status 'G'), aber fast.
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#13

Re: SELECT DISTINCT und JOIN - Redundanzen verringern

  Alt 21. Okt 2007, 14:34
Dann hol dir jeweils den 1. Datensatz mit der selben ID.

select STR_ID, MIN( name1), MIN(Name2), MIN(Name3) from Tabelle ORDER BY STR_ID;
Markus Kinzler
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#14

Re: SELECT DISTINCT und JOIN - Redundanzen verringern

  Alt 21. Okt 2007, 14:47
Zitat von mkinzler:
Dann hol dir jeweils den 1. Datensatz mit der selben ID.

select STR_ID, MIN( name1), MIN(Name2), MIN(Name3) from Tabelle ORDER BY STR_ID;
Das scheint das einfachste Verfahren zu sein.

Kann ich da noch den Status einbauen? Mir ist gerade die Idee gekommen, dass ich den Status 'G' durch '0' ersetzen könnte; dann wäre bei "Order By Str_ID, Status" der jeweils erste Treffer derjenige, den ich in die Zieltabelle nehmen möchte. Aber mir fehlt noch eine Idee, wie ich das mit "FIRST 1" kombinieren könnte. (Ich vermute, dass ein doppeltes SELECT mit SELF-JOIN zu meinen Problemen geführt hat.) Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#15

Re: SELECT DISTINCT und JOIN - Redundanzen verringern

  Alt 21. Okt 2007, 14:47
Oder eventuell so:
SQL-Code:
select StrId, Status, Name_Sort, Name46, Name22
from Tabelle
where StrNr = 1
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#16

Re: SELECT DISTINCT und JOIN - Redundanzen verringern

  Alt 21. Okt 2007, 14:58
Welchen Status willst du?
Markus Kinzler
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#17

Re: SELECT DISTINCT und JOIN - Redundanzen verringern

  Alt 21. Okt 2007, 15:16
Zitat von mkinzler:
Welchen Status willst du?
Siehe Quelltabelle in #9. Vorzugsweise 'G' (= gültig), aber den gibt es nicht bei allen Namen (in meinem Beispiel bei ID=837). Stattdessen kann ich, wie gesagt, auch '0' benutzen. Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#18

Re: [Erledigt] SELECT DISTINCT und JOIN - Redundanzen verrin

  Alt 21. Okt 2007, 15:55
Danke an Jelly und mkinzler,

aufbauend auf Euren Hinweisen habe ich es geschafft und dabei sogar den Status eingebaut. Die entscheidenden Ideen waren, MIN() zu verwenden mit passender Sortierung. Zusätzlich werden GROUP BY und ORDER BY sowie weiterhin DISTINCT benötigt. So sieht jetzt mein Code aus:
SQL-Code:
INSERT INTO STR_Namen
            ( ID, Aendg_per,
              Name_Sort, Name_lang, Name_kurz )
       SELECT DISTINCT str_id,
              max(Geltung),
              min(Name_sort),
              SUBSTR(min(Status || Name46), 2,50),
              SUBSTR(min(Status || Name22), 2,50)
         FROM Quelle_Post_St
         GROUP BY Str_id, Name_sort
         ORDER BY Str_id, Name_sort
Alle Informationen werden so übernommen wie gewünscht; der bevorzugte Status 'G' musste vorher durch '0' (Null) ersetzt werden. Meine Idee dabei ist, dass der Status vor die (variablen) Namen gesetzt wird, dann der Minimalwert übernommen und vor dem Speichern wieder entfernt wird.

Das Ganze läuft auch in akzeptabler Geschwindigkeit von weniger als zwei Minuten (nicht gemessen, nur gefühlt - bei 512 MB RAM).

Danke für Eure Hilfe! Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz