2.1k Aufrufe
Gefragt in Datenbanken von copd Einsteiger_in (7 Punkte)
Hallo Leute,

vielleicht könnt ihr mir (Access-Neuling) bei einer ganz konkreten Aufgabe helfen.

Ich habe eine Datenbank (Tabelle1), die enthält Adressen. Natürlich kommen manche Werte sehr oft vor. Allerdings ist jeder Datensatz (Zeile) einzigartig.
Aufbau der Datenbank:
ID (Autowert), Gemeinde-Zahl, PLZ, Ortsname, Strasse

Nun bekomme ich wöchentlich eine Excel-Liste mit Adressen, die ich gerne mit der Datenbank vergleichen will.
Dazu importiere ich die Liste dann in Access als Tabelle2.
Aufbau: Gemeinde-Zahl, PLZ, Ortsname, Strasse

Ausgeben soll mit Access dann alle Datensätze aus Tabelle2, die nicht vorkommen in der Tabelle1.
Ein Bonus wäre noch, wenn der Bericht zudem ausgäbe, welcher Wert denn nicht stimmt aus dem Datensatz.

Beispiel?

Tabelle1: ID (Autowert), Gemeinde-Zahl, PLZ, Ortsname, Strasse
Daten: 12345, 9184000, 81555, München, Hohlweg

Tabelle2: Gemeinde-Zahl, PLZ, Ortsname, Strasse
Daten: 9184000, 81555, München, Hohlgasse

Nun soll die Abfrage (oder dann der bericht) ausgeben:

Fehlerhafter Datensätze:
9184000, 81555, München, Hohlgasse, Fehler in: Strasse

3 Antworten

0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo CopD,

zunächst einmal eine fachliche Frage. Bei deinem Ansatz muss ich davon ausgehen, dass zu einer Gemeinekennziffer, PLZ und Ortsname immer nur eine Straße existiert. Denn wenn es zu deinem Beispiel noch einen Datensatz "9184000, 81555, München, Hauptstraße" exitistiert, kann nicht mehr unterschieden werden zu welchem Datensatz ein Fehler vorliegt und es werden zwei (oder mehr) fehlerhafte Satze gefunden. Dies gilt übrigens auch für die anderen Felder. Ist dies so? Wenn ja, dann habe ich hier eine SQL-Abfrage, die in die Richtung für deine Lösung geht (Statt Tabelle1/2 habe ich Adressen1/2 verwendet). Bei dieser Fehlerermitlung gehe ich nur von einem singulären Fehler aus. Es darf also nur ein Feld abweichen. Dies kann aber z.B. über eine UNION erweitert werden. Das Statement ist "länglich" aber nicht kompliziert:
[code]
SELECT Adressen2.*,
IIf(Adressen1.Gemeindekennzahl=Adressen2.Gemeindekennzahl
And Adressen1.PLZ=Adressen2.PLZ
And Adressen1.Ortsname=Adressen2.Ortsname
And Adressen1.Strasse<>Adressen2.Strasse,
"Straße falsch",
IIf(Adressen1.Gemeindekennzahl=Adressen2.Gemeindekennzahl
And Adressen1.PLZ=Adressen2.PLZ
And Adressen1.Ortsname<>Adressen2.Ortsname
And Adressen1.Strasse=Adressen2.Strasse,
"Ortsname falsch",
IIf(Adressen1.Gemeindekennzahl=Adressen2.Gemeindekennzahl
And Adressen1.PLZ<>Adressen2.PLZ
And Adressen1.Ortsname=Adressen2.Ortsname
And Adressen1.Strasse=Adressen2.Strasse,
"PLZ falsch",
iIf(Adressen1.Gemeindekennzahl=Adressen2.Gemeindekennzahl
And Adressen1.PLZ=Adressen2.PLZ
And Adressen1.Ortsname=Adressen2.Ortsname
And Adressen1.Strasse<>Adressen2.Strasse,
"Gemeinekennzahl falsch",
""
)
)
)
) AS Fehlerinfo
FROM Adressen1, Adressen2
WHERE
(
Adressen1.Gemeindekennzahl)=[Adressen2].[Gemeindekennzahl]
AND Adressen1.PLZ=[Adressen2].[PLZ]
AND Adressen1.Ortsname=[Adressen2].[Ortsname]
AND ((Adressen1.Strasse<>[Adressen2].[Strasse]
)
OR
(
Adressen1.Gemeindekennzahl=[Adressen2].[Gemeindekennzahl]
AND Adressen1.PLZ=[Adressen2].[PLZ]
AND Adressen1.Ortsname<>[Adressen2].[Ortsname]
AND Adressen1.Strasse=[Adressen2].[Strasse]
)
OR
(
Adressen1.Gemeindekennzahl=[Adressen2].[Gemeindekennzahl]
AND Adressen1.PLZ<>[Adressen2].[PLZ]
AND Adressen1.Ortsname=[Adressen2].[Ortsname]
AND Adressen1.Strasse=[Adressen2].[Strasse]
)
OR
(
Adressen1.Gemeindekennzahl)<>[Adressen2].[Gemeindekennzahl]
AND Adressen1.PLZ=[Adressen2].[PLZ]
AND Adressen1.Ortsname=[Adressen2].[Ortsname]
AND Adressen1.Strasse=[Adressen2].[Strasse]
);
[code]

Hast du dir so was vorgestellt?

Gruß
Ralf
0 Punkte
Beantwortet von copd Einsteiger_in (7 Punkte)
Ich habe mir noch mal Gedanken gemacht, wie man das Problem einfacher lösen könnte.

Mein Ansatz ist, dass es viel leichter (und auch schneller) wäre, wenn ich jeweils nur EIN (einzigartiges) Feld der Liste mit EINEM (einzigartigen) Feld der Datenbank vergleich, ob es darin NICHT vorkommt.

Dazu müsste ich erst in der Datenbank (und in der Abfrageliste) ein neues Feld generieren, in das ein String kommt, welcher alle betreffenden Felder beinhaltet, also Gemeindezahl+PLZ+Ort+Straße. Dann habe ich pro Datensatz 1 Wert, der in der gesamten Datenbank einzigartig ist und leicht verglichen werden könnte.

Aber wie das geht, ka. In Excel wüsste ich, wie ich es mit VBA lösen könnte.
0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo CopD,

schneller und leichter? Das ist leicht und schneller(?) - also lass' deine CPU mal ein bißchen arbeiten, das schadet nichts. Dein neuer Ansatz verfehlt auch deine Anforderungen in deiner Anfangsfrage. Damit kannst du nicht mehr unterscheiden, wodurch die Abweichung begründet ist.
Hast du mein Vorschlag ausprobiert?
Die Performance kannst du durch passende Indzes auf die betreffenden Felder noch deutlich erhöhen (aber auch der benötigte Speicherplatz und die Zeit für "inserts" oder "updates").
Wenn du sehr viele Adresssätze hast, also z.B. deutlich mehr als 1 Million, würde ich dir von meinem Lösungsvorschlag nicht abraten, eher von der Hardware oder der Datenbank!

Gruß
Ralf
...