Da du ein Distinct auf t1 abfragst sind weitere Links auf tCastCrew in der FROM Clause unnötig.
Ich habe das gerade in der etwas verspäteten Frühstückspause getippt (einhändig mit dem Brötchen in der linken Hand
)
Delphi-Quellcode:
procedure TForm1.PrepareQuery(
var Query :TADOQuery;
const SearchWords:
array of string);
const
SQL_Body =
'
SELECT Distinct t1.Id' + #10 +
'
,t1.Titel' + #10 +
'
FROM tfilm t1' + #10 +
'
Left JOIN tdarsteller t2 ON t1.Id = t2.IdFilm' + #10 +
'
Left JOIN tcastcrew t3 ON t3.Id = t2.IdCast';
SQL_Order = '
ORDER By Titel';
var
i: Integer;
Filterstr:
string;
begin
// entferne alle Parameter der ADOQuery
with Query do
begin
Parameters.Clear;
for i := 0
to high(SearchWords)
do
if Trim(SearchWords[i]) <> '
'
then
begin
FilterStr := FilterStr +
Format('
Or' + #10 +
'
upper(t3.Vorname || ''
''
|| t3.Nachname) Like :i_Actor%d'
, [succ(i)]);
// Erzeuge einen Parameter
with Parameters.AddParameter
do
begin
DataType := ftString;
Direction := pdInput;
Name := '
i_Actor' + IntToStr(succ(i));
// alle Leerzeichen werden mit % ersetzt
Value := '
%' + AnsiUpperCase(StringReplace(Trim(SearchWords[i])
, #32, '
%'
, [rfReplaceALL])) + '
%';
end;
end;
if FilterStr <> '
'
then
begin
System.Delete(FilterStr, 1, 9);
FilterStr := '
WHERE' + FilterStr + #10;
end;
SQL.Text := SQL_Body + #10 +
FilterStr +
SQL_Order;
end;
end;
Gib ihm eine
Query & einen Array aus Suchwörtern und er wird dir die
Query so vorbereiten, dass ein "Open" reicht.
Da ich bei mir keine
BDE installiert habe habe ich es mit einer ADOQuery getestet (2-3 Änderungen und es läuft mit einer TQuery.
)
Eine Suche nach 2 Schauspielern ergibt zum Bleistift (die Parameter sind natürlich bereits besetzt
):
SQL-Code:
SELECT Distinct t1.Id
,t1.Titel
FROM tfilm t1
Left JOIN tdarsteller t2 ON t1.Id = t2.IdFilm
Left JOIN tcastcrew t3 ON t3.Id = t2.IdCast
WHERE upper(t3.Vorname || ' ' || t3.Nachname) Like :i_Actor1 Or
upper(t3.Vorname || ' ' || t3.Nachname) Like :i_Actor2
ORDER By Titel