Logische SQL-Query problem...
Geizhals » Forum » Programmierung » Logische SQL-Query problem... (19 Beiträge, 168 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
Logische SQL-Query problem...
09.03.2006, 15:15:49
Ich sitze gerade mit ein Problem hier. Gefragt ist eine "freie Textsuche über alle Felder". Damit ist eine Suche nach 1 oder mehrere Suchwörter über alle Felder in eine Abfrage gemeint. Mit als Suchbegriff "amnesty wien" sollten alle Kontakten gefunden werden die irgendwo in der Daten 'Amnesty' und 'Wien'  stehen haben. "Hr. Amnesty" aus "Wiener Neustadt" genauso wie "Fr. Wien" von "Amnesty International" in Brussel.

Um den WHERE-Statement auf zu bauen, gehe ich in eine Schleife durch alle Felder, und pro Feld hänge ich die Suchwörter dran, sodaß etwas wie "WHERE ( Name = wien OR Name = amnesty ) AND ( Ort = wien OR Ort = amnesty ) AND ( Orga = wien OR Orga = amnesty ) entsteht. (natürlich verwende ich LIKE mit entsprechende * und Anführungszeichen).

Syntaktisch stimmt der Abfrage schon, aber er liefert trotzdem nicht die gewünschte Ergebnisse. Wenn ich 'AND' wie im beispiel verwende, gibt er mir nur die Datensätze zurück die eine der Suchwörter in _alle_ Felder hat, oder wenn ich OR verwende, gibt er mir alle Datensätze zurück die eine der Suchwörter irgendwo stehen haben. Im 1. Fall kriege ich zuwenig (meistens gar kein) Ergebnisse zurück, im 2. Fall viel zuviele Ergebnisse...

Der große Frage: wie kann ich das WHERE-Statement so aufbauen das er nur die Datensätze zurückgibt die ich brauche?

Umgebung ist (leider) Access 2003 und Jet-SQL...

Ardjan


<stolz> Mein Sohn! </stolz>

   !!! VIRUSWARNUNG !!!
Antworten PM Übersicht Chronologisch
 
Melden nicht möglich
...
Re(3): Logische SQL-Query problem...
10.03.2006, 12:47:01
Du kannst es ja trotzdem lösen...
Eine tabelle "FULLTEXT" mit den Indizes - a la
ID  autowert
wort   text(255)
tabelle text(100)
attr_in_tabelle     text(100)
id_in_tabelle        long

Alle spalten indiziert  für schnelle Joins.
wort immer in Großschrift eintragen

Dort würde zB stehen:
1, "AMNESTY", "Kunden","Anschrift",212
2, "INTERNATIONAL","Kunden","Anschtift",212
.....

Eine query, wo überall "Amnesty International" auftaucht, würde dann ungefähr wie folft aussehen können:

SELECT DISTINCT a.tabelle,a.attr_in_tabelle,a.id_in_tabelle
FROM  fulltext as a INNER JOIN fulltext as b USING(tabelle,attr_in_tabelle,id_in_tabelle)
WHERE a.wort='AMNESTY' and b.wort='INTERNATIONAL'
;

Du müßtest dann eine Liste all der Tabellen, Attribute und ID's dort erhalten, in denen sowohl "Amnesty" als auch "International" vorkommen.
der Inner Join (Hoffe, daß die Syntax in Access so klappt, wenn net bekommst es hin) geht über Indizes, die wortsuche ebenfalls - das ist auch ungefähr der Mechanismus, der bei Fulltext-Indizes herangezogen wird.

Wenn du zusätzlich dem User Abfragen a la "AMNES*" erlauben willst, speicherst halt "A","AM","AMN","AMNE",... in der Fulltext-Tabelle.

Trigger gehen ja mal in Access net (*SCHLUCHZ*), aber du könntest das inserten ja notgedrungen in der Applikationslogik verpacken, dann ersparst du dir auch den Batch-Job (den ich aber trotzdem einbauen würde, weil ja evtl. andere "an den Forms vorbei" in der DB rumviechern.



Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung