Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi bin am verzweifeln... select abfragen miteinander kombinieren??? (https://www.delphipraxis.net/161073-bin-am-verzweifeln-select-abfragen-miteinander-kombinieren.html)

DeddyH 16. Jun 2011 14:08

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Für einen OUTER JOIN kenne ich keine (offizielle) Variante ohne das Wort JOIN. Was ist denn daran so schlimm?

Serienchiller 16. Jun 2011 14:22

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
na schlimm ist daran, dass ich mit jeder variante die ich mit join versucht habe, seit 12 stunden programmieren immer nur sql fehler produziert habe, auch mit den varianten aus diesem thread. erst seit ich den umweg ohne join gehe, funktionieren meine abfragen.

DeddyH 16. Jun 2011 14:27

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Den JOIN brauchst Du doch nur ein einziges Mal, was sich danach ändert, ist ja nur die Filterbedingung. Wenn Du als Basis das hier nimmst (Tabellen-/Feldnamen ersetzen):
SQL-Code:
SELECT
  A.*
FROM
  Tabelle1 A
LEFT JOIN
  Zwischentabelle B ON B.Fremdschlüsselfeld = A.Primärschlüsselfeld
LEFT JOIN
  Bildertabelle C ON C.Primärschlüsselfeld = B.Fremdschlüsselfeld
entspricht das im Ergebnis (wenn ich keinen Denkfehler mache):
SQL-Code:
SELECT
  *
FROM
  Tabelle1
Interessant wird es nun durch Einfügen/Ändern der WHERE-Klausel.

Serienchiller 16. Jun 2011 14:32

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
das problem kommt dann wenn ich in eine select anweisung 5! tabellen einbauen muss wie eben hier:

Delphi-Quellcode:
if not frmhaupt.CheckBox1.Checked and frmhaupt.CheckBox2.Checked and
      frmhaupt.CheckBox3.Checked then
      dm.dsetbilder.SelectSQL.Add('select * from zwbilderprogramme z, '+
        'bilder b, programme p,zwbildertags x, tags t '+
        'where ((b.bid=z.bildid and p.pid=z.programmid) ' +
        'and (b.bid=x.bildid and t.tid=x.tagid)) '+
        'and (p.namep containing UPPER(:WERT) or t.namet '+
        'containing upper(:WERT) or x.id is null) order by upper(b.name)');

DeddyH 16. Jun 2011 14:40

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Ob 2, 10 oder 200 Tabellen ist doch syntaktisch egal, das Muster ist immer dasselbe. Du musst da Tippfehler drinhaben oder sowas. Füg doch einfach mal eine nach der anderen Tabelle im JOIN dazu, bis es knallt. Das Statement kannst Du hier posten, dann können wir mal drüberschauen, was da nicht stimmen könnte.

Serienchiller 16. Jun 2011 14:47

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
also mit 3 tabellen funktioniert es schonmal :) hattest recht.

Delphi-Quellcode:
if frmhaupt.CheckBox1.Checked and not frmhaupt.CheckBox2.Checked and
      frmhaupt.CheckBox3.Checked then
      dm.dsetbilder.SelectSQL.Add('select b.* from bilder b left join '+
        'zwbildertags x on x.bildid=b.bid left join tags t '+
        'on t.tid=x.tagid where (t.namet containing UPPER(:WERT) or b.name '+
        'containing upper(:WERT)) order by upper(b.name)');
nur wie füg ich da jetzt noch die anderen beiden dazu?

DeddyH 16. Jun 2011 14:49

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Na, genauso ("LEFT JOIN Tabelle ON ..." vor der WHERE-Bedingung).

Jumpy 16. Jun 2011 14:53

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Wie wäre es damit, erstmal die maximale Datenmenge zu ermitteln (ggf. als View speichern):

Code:
Select b.*,p.*,t.* From bilder b
Left Join zwbilderprogramme zbp on b.bID = zbp.bildID
Left Join programme p on zbp.programmID = p.pID
Left Join zwbildertags zbt on b.bID = zbt.bildID
Left Join tags t on zbt.tagID = t.tID
Darauf dann dynamisch die Abfrage basteln, weil für alle Kombinationen der Checkboxen eine eigene Abfrage zu basteln ist doch zu aufwendig.

Select bID From
(Select ... [s.o.]])
Where //ab hier dynamisch erzeugen
Or
Or

DeddyH 16. Jun 2011 14:54

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Zitat:

Zitat von Jumpy (Beitrag 1106804)
..., weil für alle Kombinationen der Checkboxen eine eigene Abfrage zu basteln ist doch zu aufwendig.

Wie gesagt, muss er ja gar nicht, es ändert sich lediglich die WHERE-Klausel je nach Stand der Checkboxen.

Serienchiller 16. Jun 2011 14:56

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
super das werd ich jetzt angehen hab ein gutes gefühl...
wenn es statisch alles funktioniert bau ich mir die dynamik danach rein.

Jumpy 16. Jun 2011 15:04

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Zitat:

Zitat von DeddyH (Beitrag 1106805)
Zitat:

Zitat von Jumpy (Beitrag 1106804)
..., weil für alle Kombinationen der Checkboxen eine eigene Abfrage zu basteln ist doch zu aufwendig.

Wie gesagt, muss er ja gar nicht, es ändert sich lediglich die WHERE-Klausel je nach Stand der Checkboxen.

OK, dann hab ich was überlesen. Dachte das läuft jetz hinaus auf:

Delphi-Quellcode:
if cb1.Checked and not cb2.Checked and not cb3.Checken then...
if not cb1.Checked and cb2.Checked and not cb3.Checken then...
if not cb1.Checked and not cb2.Checked and cb3.Checken then...
if cb1.Checked and cb2.Checked and not cb3.Checken then...
if cb1.Checked and not cb2.Checked and cb3.Checken then...
if not cb1.Checked and cb2.Checked and cb3.Checken then...
if cb1.Checked and cb2.Checked and cb3.Checken then...
und jedes mal ein eigenes SQL-Statement basteln mit veränderten Tabellen und veränderter Where-Bedingung...

DeddyH 16. Jun 2011 15:04

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Genau, lass die WHERE-Klausel voerst ganz weg, JOINe alle benötigten Tabellen der Reihe nach zusammen und kontrolliere das Ergebnis (das sich nicht ändern sollte). Danach baust Du Dir dynamisch Deinen Filter zusammen und bist fertig.

[edit] @Jumpy: schau nochmal auf der ersten Seite nach, da wurde auch nur die WHERE-Klausel zusammengesetzt. Das einzige Schwierige dabei ist, dass sie halt mit WHERE beginnen muss und danach dann nur noch ORs folgen. Aber das bekommt man mit der in meinem Beispiel verwendeten Boolean-Variable ja in den Griff. [/edit]

Serienchiller 16. Jun 2011 15:10

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
so es hat endlich funktioniert. hab auch ein bisl dynamik schon reingebaut. dank dir für deine geduld. das mit dem left join das hätte mir gestern mal jemand sagen müssen...

Delphi-Quellcode:
procedure anzeigen(befehl: String);
begin
  dm.dsetbilder.Close;
  dm.dsetbilder.SelectSQL.Clear;
  if befehl = 'alleanzeigen' then
  begin
    dm.dsetbilder.SelectSQL.Add('select * from bilder b order '+
      'by upper(b.name)');
  end
  else
  begin
    dm.dsetbilder.SelectSQL.Clear;
    dm.dsetbilder.SelectSQL.Add('select b.* from bilder b left join '+
        'zwbildertags x on x.bildid=b.bid left join tags t '+
        'on t.tid=x.tagid left join '+
        'zwbilderprogramme z on z.bildid=b.bid left join programme p '+
        'on p.pid=z.programmid ');

// nur bild
    if frmhaupt.CheckBox1.Checked and not frmhaupt.CheckBox2.Checked and
      not frmhaupt.CheckBox3.Checked then
      dm.dsetbilder.SelectSQL.Add('where b.name containing upper(:WERT) ');

// nur programm
    if not frmhaupt.CheckBox1.Checked and frmhaupt.CheckBox2.Checked and
      not frmhaupt.CheckBox3.Checked then
      dm.dsetbilder.SelectSQL.Add('where Upper(p.namep) containing UPPER(:WERT)');

// nur tag
    if not frmhaupt.CheckBox1.Checked and not frmhaupt.CheckBox2.Checked and
      frmhaupt.CheckBox3.Checked then
      dm.dsetbilder.SelectSQL.Add('where Upper(t.namet) containing UPPER(:WERT)');

// bild und programm
    if frmhaupt.CheckBox1.Checked and frmhaupt.CheckBox2.Checked and
      not frmhaupt.CheckBox3.Checked then
      dm.dsetbilder.SelectSQL.Add('where (p.namep containing UPPER(:WERT) '+
        'or b.name containing upper(:WERT)) order by upper(b.name)');

// bild und tag
    if frmhaupt.CheckBox1.Checked and not frmhaupt.CheckBox2.Checked and
      frmhaupt.CheckBox3.Checked then
      dm.dsetbilder.SelectSQL.Add('where (t.namet containing UPPER(:WERT) '+
      'or b.name containing upper(:WERT)) order by upper(b.name)');

// programm und tag
    if not frmhaupt.CheckBox1.Checked and frmhaupt.CheckBox2.Checked and
      frmhaupt.CheckBox3.Checked then
      dm.dsetbilder.SelectSQL.Add('where (t.namet containing UPPER(:WERT) or '+
        'p.namep containing UPPER(:WERT)) order by upper(b.name)');

// alle 3 zusammen
    if frmhaupt.CheckBox1.Checked and frmhaupt.CheckBox2.Checked and
      frmhaupt.CheckBox3.Checked then
      dm.dsetbilder.SelectSQL.Add('where (t.namet containing UPPER(:WERT) or '+
        'p.namep containing UPPER(:WERT) or b.name containing upper(:WERT)) '+
        'order by upper(b.name)');

    dm.dsetbilder.ParamByName('WERT').AsString := befehl;
  end;
  dm.dsetbilder.Open;
  if dm.dsetbilder.IsEmpty then showmessage('Keine Icons gefunden');
end;

DeddyH 16. Jun 2011 15:13

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Zitat:

Zitat von Serienchiller (Beitrag 1106812)
das mit dem left join das hätte mir gestern mal jemand sagen müssen...

Wenn ich gewusst hätte, wie Deine Ergebnismenge aussehen soll, hätte ich Dir das gestern auch schon gesagt. Der entscheidende Hinweis kam ja erst heute ;)

Serienchiller 16. Jun 2011 15:30

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
war halt eher ein kommunikationsproblem...
aber jetzt wo ich das mit den joins richtig verstanden habe kann ich mein programm auch um einige datasets erleichtern :) war ne schwere geburt aber hat sich gelohnt...

danke nochmal an alle die so fleißig mitgeraten haben :D

mkinzler 16. Jun 2011 15:35

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Um sehr mehr Tabellen gejoint werden, um so übersichtlicher werden explitite Joins ( im Vergleich zu der impliziten Variante). Zudem man nur bei Oracle implizit outerjoinen kann (+); möglichweise können das auch andere DBMS, ist aber kein Standard.

Serienchiller 17. Jun 2011 08:29

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
so jetzt hab ich doch noch ein problem. und zwar zeigt er mir seit heute früh für jede verbindung die in der zwischentabelle steht, jeden ds einmal an. also habe ich jetzt teilweise 4 oder bis zu 8 mal die selben bilder untereinander stehen. :( gestern nachmittag war das irgendwie nicht so...

hier meine anzeigen prozedur zum jetzigen zeitpunkt:

Delphi-Quellcode:
procedure anzeigen(befehl: String);
var
  schon: boolean;
begin
  schon:= false;
  dm.dsetbilder.Close;
  dm.dsetbilder.SelectSQL.Clear;
  dm.dsetbilder.SelectSQL.Add('select * from bilder b left join '+
        'zwbildertags x on x.bildid=b.bid left join tags t '+
        'on t.tid=x.tagid left join '+
        'zwbilderprogramme z on z.bildid=b.bid left join programme p '+
        'on p.pid=z.programmid ');
  if frmhaupt.CheckBox1.Checked then    // bild
  begin
    dm.dsetbilder.SelectSQL.Add('where b.name containing upper(:WERT) ');
    schon:= true;
  end;
  if frmhaupt.CheckBox2.Checked then    // programm
  begin
    if schon then dm.dsetbilder.SelectSQL.Add('or Upper(p.namep) '+
      'containing UPPER(:WERT) ')
    else dm.dsetbilder.SelectSQL.Add('where Upper(p.namep) '+
      'containing UPPER(:WERT) ');
    schon:= true;
  end;
  if frmhaupt.CheckBox3.Checked then    // tag
  begin
    if schon then dm.dsetbilder.SelectSQL.Add('or Upper(t.namet) '+
      'containing UPPER(:WERT) ')
    else dm.dsetbilder.SelectSQL.Add('where Upper(t.namet) '+
      'containing UPPER(:WERT) ');
    schon:= true;
  end;
  if befehl <> 'alleanzeigen' then
    dm.dsetbilder.ParamByName('WERT').AsString := befehl;

  dm.dsetbilder.Open;
  if dm.dsetbilder.IsEmpty then showmessage('Keine Icons gefunden');
end;

DeddyH 17. Jun 2011 08:43

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Wie sieht denn das resultierende SQL aus?

Serienchiller 17. Jun 2011 08:55

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Delphi-Quellcode:
select * from bilder b left join zwbildertags x on x.bildid=b.bid left join tags t on t.tid=x.tagid left join zwbilderprogramme z on z.bildid=b.bid left join programme p on p.pid=z.programmid
where b.name containing upper(:WERT)
ps: wie macht man sql tags?

DeddyH 17. Jun 2011 08:57

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Hat die Tabelle bilder einen Primärschlüssel? SQL-Tags gehen mit [ code=sql ][ /code ] (ohne die Leerzeichen).

Serienchiller 17. Jun 2011 09:02

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
ja hat sie und zwar b.bid

SQL-Code:

select * from bilder b
left join zwbildertags x on x.bildid=b.bid
left join tags t on t.tid=x.tagid
left join zwbilderprogramme z on z.bildid=b.bid
left join programme p on p.pid=z.programmid

DeddyH 17. Jun 2011 09:05

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Dann fällt mir als Workaround auf die Schnelle so etwas ein:
SQL-Code:
SELECT
  *
FROM
  bilder
WHERE
  bid IN(
    SELECT
      DISTINCT A.bid
    FROM
      bilder A
    LEFT JOIN --hier jetzt die ganzen JOINs
      ...
  )

jobo 17. Jun 2011 09:11

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Du solltest darauf achten, keine Phantome zu jagen.
Du hast jetzt dynamisches SQL und gestern sah Dein Delphi code noch so aus, dass Du "nur" bestimmte Checkbox Kombinationen abgefragt hast (and/or/not Kombinationen).
Nun hast Du reine Or Verknüpfungen, die der Reihe nach abgegrast werden.
Sprich, Du bekommst nun wahrscheinlich einfach erstmalig die volle Ergebnissmenge. Ein Tag, das eben an mehreren Stellen greift, ergibt für jeden Or Fall ein Ergebnis.
Das sollte über ein "Distinct" oder "Grouy by" einzudampfen sein.

Stichwort "schon" Variable:
Ich hab nicht alles verfolgt in dem Thread, aber vielleicht kannst Du statt der aufwendigen und unübersichtlichen Varianten Handhabung die where-Clause fest einbauen mit einer Bedingung die immer wahr ist
SQL-Code:
where 1=1 and([Hier der dynamische Teil])
Das finden nicht alle gut, aber Du sparst Dir viel Code und gewinnst Übersichtlichkeit.

Serienchiller 17. Jun 2011 09:12

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
so da haben wirs wieder :wall:
sql error -104
as aproximate floating point values in sql dialect1, but as 64 bit

DeddyH 17. Jun 2011 09:13

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
*Gnarf* das SQL bitte.

Serienchiller 17. Jun 2011 09:17

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
SQL-Code:
SELECT * FROM bilder b WHERE b.bid IN( 
SELECT DISTINCT b.bid FROM bilder b
left join zwbildertags x on x.bildid=b.bid
left join tags t on t.tid=x.tagid
left join zwbilderprogramme z on z.bildid=b.bid
left join programme p on p.pid=z.programmid

jobo 17. Jun 2011 09:18

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Hast Du eigentlich ein SQL Browser, mit dem Du die Abfragen zuvor ohne Delphi zusammenstellen kannst. Gerade wenn das Neuland für Dich ist, könnte das die produktivere Arbeitsweise sein.
Anwendungsfälle statisch in direkt im SQL Fenster aufbauen, Syntax checken, abrufen, Ergebnis plausibilisieren.
Dann kannst Du das zu Delphi übertragen.

Da fehlt eine Klammer, oder?

DeddyH 17. Jun 2011 09:20

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Zitat:

Zitat von jobo (Beitrag 1106921)
Da fehlt eine Klammer, oder?

Genau, ganz am Schluss des Statements. Die Sortierung kann man dann auch noch schön dahinter unterbringen. Außerdem ist der Alias b doppelt vergeben, die äußere Abfrage kommt auch ohne Alias aus.

Serienchiller 17. Jun 2011 09:21

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
man bin ich doof hast recht seh ich jetzt erst...

Serienchiller 17. Jun 2011 09:26

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
ok also mit der klammer funktionierts, doch an welcher stelle müsste ich jetzt die where klauseln einfügen?

Serienchiller 17. Jun 2011 09:32

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
also habe jetzt die where klauseln eingefügt vor der letzten klammer. funktioniert alles. danke nochmal.

SQL-Code:
SELECT * FROM bilder WHERE bid IN( 
SELECT DISTINCT b.bid FROM bilder b
left join zwbildertags x on x.bildid=b.bid
left join tags t on t.tid=x.tagid
left join zwbilderprogramme z on z.bildid=b.bid
left join programme p on p.pid=z.programmid
where b.name containing upper(:WERT)
or Upper(p.namep) containing UPPER(:WERT)
)

DeddyH 17. Jun 2011 09:33

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Innerhalb der Klammer. Du ermittelst damit ja die unterschiedlichen PKs der Datensätze, die den Suchbedingungen entsprechen und holst daraus dann im äußeren SELECT erst die eigentlichen Daten.

Serienchiller 17. Jun 2011 09:35

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
@jobo
kann ich das im ibexpert machen? also sql befehle direkt eingeben?

mschaefer 17. Jun 2011 09:38

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
-- roter Kasten -- Kommentar gestrichen --

jobo 17. Jun 2011 09:41

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Ich hab den IBExpert erst einmal benutzt, glaub unter Linux. Hier hab ich grad keinen.
Aber wenn ich mich richtig erinnere ja.
Das solltest Du aber einfach rausfinden können, wenn Du ihn vor Dir hast. Ansonsten gibt es hier sicher ne Menge IBExpert Experten. :)

Edit, ich glaub, ich werf da was durcheinander, das war nicht der IBExpert.

DeddyH 17. Jun 2011 09:43

AW: bin am verzweifeln... select abfragen miteinander kombinieren???
 
Unter "Nützliches" befindet sich der SQL-Editor IIRC.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:20 Uhr.
Seite 2 von 2     12   

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