Zitat
«von silentwolf am: Heute um 07:33:52 »
In meiner DB tblKontakte und eine tblImport sollen Datensätze verglichen werden die in tblKontakte Kon_Name mit tblImport Umstext als Teilstring übereinstimmen.
Wenn eine übereinstimmung besteht sollte in der tblImport ein neues Feld mit dem Namen Kontakt erstellt werden und den Feldinhalt der tblKontkate.Kon_Name einfügen.
Das Problem ist das in der tblImport z.B. der Datensatz Huber Heinz und Hanelore Feldweg 13 6858 Testinghausen enthalten ist aber in der tblKontakte eben nur Huber Heinz erfasst ist.
Wie kann ich denn diesen Datensatz vergleichen finden und einfügen? Mit einer Aktualisierungsabfrage mit gemeinsamen Feld geht das ja nicht so einfach oder da die also mit einer Zuordnungstabelle woe Kon_Name mit Kontakt verknüpft wäre.
Wie kann man denn so etwas realisieren.
Ich möchte nochmal auf das vorige, schon geschlossene Thema zurückkommen:
Ich sehe das auch so wie ebs17, dass die Struktur der vorgegebenen Datenbank denkbar ungünstig für die Weiterverarbeitung ist (Name, Straße, Ort in einem Feld !).
Aber manchmal sind einem ja ungünstige Datenstrukturen vorgegeben, die man nicht ändern kann.
Deshalb für mich als Access-Anfänger als Übung die Fragestellung:
Wie ändere ich Tabelle1.Ergebnis in Abhängigkeit davon, ob einer der Werte aus Tabelle2.Text in Tabelle1.langerText vorkommt ?
Konkret: Wenn ein Name aus der Liste Tabelle2.Text (
Kunze, Krause, ...)
in Tabelle1.langerText ("
Kunze & Söhne", "Karl
Krause, Bochum", ...)vorkommt,
soll Tabelle1.Ergebnis "ja" (oder, Variante von silentwolf: "Krause", ...) heißen.
Nochmals: Datenstrukturen mit mehreren Informationen in einem Feld sollen strikt vermieden werden.
Aber als Übungsaufgabe interessiert mich, wie man so eine Fragestellung löst.
Hallo,
als Denkanstoß:
Eine Verknüpfung mit zwei Tabellen kann auch durch Verwendung des "Like"-Operators oder durch Funktionen (wie z. B. Instr()) geschehen, wenn es auf Teilinhalt, bzw. Ähnlichkeit ankommt:
Select * from Tabelle1 inner join Tabelle2 on Tabelle1.Textfeld like "*" & Tabelle2.Textfeld
oder
Select Tabelle2.Textfeld from Tabelle1 inner join Tabelle2 on InStr(Tabelle1.Textfeld, Tabelle2.Textfeld)
Damit könnte z. B. die erste Teilaufgabe gelöst werden.
Das Ablegen in ein zusätzliches Feld wäre dann die Aufgabe einer Aktualisierungsabfrage. Möglicherweise kommt Access aber mit der oben genannten Abfrage als Unterabfrage nicht richtig klar, so dass als Alternative die Dlookup-Funktion herhalten muss. (Nicht getestet).
Zu guter Letzt ist auch eine Public-Funktion denkbar die in der Aktualisierungsabfrage aufgerufen wird. (Performance-Gedanken jetzt außen vor gelassen).
ZitatName, Straße, Ort in einem Feld !
Man sollte auch daran denken, dass eine Eindeutigkeit sehr schnell verloren gehen kann. Namen können in Nachnamen, Vornamen, Straßenbezeichnungen und sogar Ortsbezeichnungen vorkommen, und viele Namen sind gar nicht so selten. Man braucht nur eine genügend große Datenbasis.
@ebs17: Ja, klar. Bereits eine "Kunze & Krause AG" sprengt die Aufgabenstellung, denn dann ist nicht mehr klar, was ins Ergebnisfeld rein soll.
@DF6GL:
Bei den gegebenen Daten:
Tabelle2.Text:
Kunze
Krause
Anderl
Tabelle1.langerText:
Kunze und Hanelore Feldweg 13 6858 Testinghausen
Kickel und Kunze Heinz Kommanditgesellschaft
Ganz Unbekannt UG (haftungsbeschränkt)
Kunze & Krause AG
führt Dein erster Vorschlag (am Ende ergänzt)
Select * from Tabelle1 inner join Tabelle2 on Tabelle1.langerText like "*" & Tabelle2.Text & "*"
im Prinzip zur erwarteten Auswahl.
Aber in dem von ebs17 erwähnten Fall, wo zwei Namen in einem Datensatz vorkommen (Kunze & Krause AG), wird der Datensatz zweimal angezeigt:
Tabelle1.langerText:
Kunze und Hanelore Feldweg 13 6858 Testinghausen
Kickel und Kunze Heinz Kommanditgesellschaft
Kunze & Krause AG
Kunze & Krause AG
Auch left Join zeigt die Kunze & Krause AG doppelt. Select distinct ... ändert daran auch nichts.
Dabei heißt es in der Access-Hilfe:
"Innere Verknüpfungen fassen Datensätze aus zwei Tabellen zusammen, wenn sich in Feldern, die in beiden Tabellen enthalten sind, übereinstimmende Werte befinden.
Eine linke äußere Verknüpfung enthält alle Datensätze aus der ersten (linken) der beiden Tabellen, selbst wenn die zweite (rechte) Tabelle keine übereinstimmenden Werte enthält."
Das ist irritierend, denn es gibt mehr Treffer, als es in Tabelle1 passende Datensätze gibt !
Wie ist das zu erklären ?
Hallo,
Zitatwird der Datensatz zweimal angezeigt:
Was ist daran verwunderlich?
Kunze & Krause AG passt zu Tabelle2."
Kunze"
Kunze & Krause AG passt zu Tabelle2."
Krause"
Zitat von: DF6GL am März 26, 2019, 08:34:30
Was ist daran verwunderlich?
Dass Datensätze aus der left- Tabelle mehrfach angezeigt werden können, hatte ich nicht erwartet.
Da kann man ja in Schwierigkeiten kommen, wann mit Trefferzahlen weiterarbeiten will (plötzlich hat eine Firma "mehr" Angestellte als sie dachte, bloß weil einer für mehrere Abteilungen arbeitet ...).
Wie stelle ich dar, dass auch ein Datensatz nur einmal dargestellt wird, der mehr als eine Entsprechung in der anderen Tabelle hat ?
1) Du gruppierst auf Inhalte Tabelle1.
2) Du reduzierst Inhalte in Tabelle2 auf jeweils eine Entsprechung vor der Verknüpfung.
Beide Varianten haben ihre Besonderheiten und wären in Abstimmung mit der Anforderung spezifisch einzubringen. Mit anderen Worten: Den einfachen universellen Schalter gibt es nicht.
Es könnt alles so einfach sein, isses aber nicht.
Mit Variante 1 geht es so:
SELECT Tabelle1.langerText
FROM Tabelle1 INNER JOIN Tabelle2 ON Tabelle1.langerText like "*" & Tabelle2.Text & "*"
group by Tabelle1.langerText;