AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Abfrage über mehrere Tabellen...
Thema durchsuchen
Ansicht
Themen-Optionen

Abfrage über mehrere Tabellen...

Ein Thema von mjenke · begonnen am 4. Jun 2004 · letzter Beitrag vom 4. Jun 2004
Antwort Antwort
Robert_G
(Gast)

n/a Beiträge
 
#1

Re: Abfrage über mehrere Tabellen...

  Alt 4. Jun 2004, 12:15
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz