Das ist mir schon klar, aber vielleicht änderst du einfach deinen Suchstring, bzw. bastelst Dir eine kleine Funktion, die das macht. Meine Lösung dürfte jedenfalls funktionieren, wenn man die Frage (also den Suchstring) anders formuliert, nämlich: Ich suche alle F1, die mindestens "die in dieser Liste enthaltenen Wörter" enthalten:
Delphi-Quellcode:
Function CreateSQL (aWords : TStringList) : String;
Var
sJoin,sWhere : String;
Begin
sJoin := 'Words w1';
sWhere := Format('w%d.wert = %s',[1,QuotedStr(aWords[0]]);
For i:=1 to aWords.count - 1 do begin
sJoin := sjoin + Format (' join words w%d on w%d = w%0:d.f1',[i,i-1]);
sWhere := sWhere + Format('and w%d.wert = %s',[i+1,QuotedStr(aWords[i]]);
End;
Result := Format ('Select distinct w1.f1 from %s where %s',[sJoin, sWhere]);
End;
Diese Routine dürfte ungefähr die Abfrage so formulieren, wie ich es vorgeschlagen habe. Deine Aufgabe ist es nun, deinen Suchtext ('Wort1 Wort2 %') in eine Stringliste zu verwandeln. Wenn das '%' bedeutet soll, das die gesuchten F1 MINDESTENS diese Wörter enthalten muss, dann kannst musst Du noch den Fall behandeln, wenn man das '%' weglässt. Dann muss die Wortmenge je F1-Wert GENAU mit der Wortliste übereinstimmen.
Wenn die Reihenfolge der Wörter auch noch eine Rolle spielt, dann musst Du die Where-Klausel je Wort noch erweitern.
[edit] Nach mehrmaligem Durchlesen Deiner Anwort verstehe ich deine Kritik... Dir ist es lieber, die Wortliste je F1 in diesen String zu konkatenieren und DANN zu suchen, dann kann man den LIKE-Operator natürlich besser verwenden... DAS scheint nur mit einer stored Procedure zu gehen. Für den Fall, das du nur Übereinstimmungen einzelner Wörter suchst, ist meine Methode jedoch ausreichend.
Ach ja: Eine gute
DB sollte niemals lange für eine Suche benötigen (Aggregate sind eine andere Sache)
[/edit]