![]() |
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?
|
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.
|
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:
entspricht das im Ergebnis (wenn ich keinen Denkfehler mache):
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
SQL-Code:
Interessant wird es nun durch Einfügen/Ändern der WHERE-Klausel.
SELECT
* FROM Tabelle1 |
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)'); |
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.
|
AW: bin am verzweifeln... select abfragen miteinander kombinieren???
also mit 3 tabellen funktioniert es schonmal :) hattest recht.
Delphi-Quellcode:
nur wie füg ich da jetzt noch die anderen beiden dazu?
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)'); |
AW: bin am verzweifeln... select abfragen miteinander kombinieren???
Na, genauso ("LEFT JOIN Tabelle ON ..." vor der WHERE-Bedingung).
|
AW: bin am verzweifeln... select abfragen miteinander kombinieren???
Wie wäre es damit, erstmal die maximale Datenmenge zu ermitteln (ggf. als View speichern):
Code:
Darauf dann dynamisch die Abfrage basteln, weil für alle Kombinationen der Checkboxen eine eigene Abfrage zu basteln ist doch zu aufwendig.
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 Select bID From (Select ... [s.o.]]) Where //ab hier dynamisch erzeugen Or Or |
AW: bin am verzweifeln... select abfragen miteinander kombinieren???
Zitat:
|
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. |
AW: bin am verzweifeln... select abfragen miteinander kombinieren???
Zitat:
Delphi-Quellcode:
und jedes mal ein eigenes SQL-Statement basteln mit veränderten Tabellen und veränderter Where-Bedingung...
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... |
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] |
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; |
AW: bin am verzweifeln... select abfragen miteinander kombinieren???
Zitat:
|
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 |
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.
|
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; |
AW: bin am verzweifeln... select abfragen miteinander kombinieren???
Wie sieht denn das resultierende SQL aus?
|
AW: bin am verzweifeln... select abfragen miteinander kombinieren???
Delphi-Quellcode:
ps: wie macht man sql tags?
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) |
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).
|
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 |
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 ... ) |
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:
Das finden nicht alle gut, aber Du sparst Dir viel Code und gewinnst Übersichtlichkeit.
where 1=1 and([Hier der dynamische Teil])
|
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 |
AW: bin am verzweifeln... select abfragen miteinander kombinieren???
*Gnarf* das SQL bitte.
|
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 |
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? |
AW: bin am verzweifeln... select abfragen miteinander kombinieren???
Zitat:
|
AW: bin am verzweifeln... select abfragen miteinander kombinieren???
man bin ich doof hast recht seh ich jetzt erst...
|
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?
|
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) ) |
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.
|
AW: bin am verzweifeln... select abfragen miteinander kombinieren???
@jobo
kann ich das im ibexpert machen? also sql befehle direkt eingeben? |
AW: bin am verzweifeln... select abfragen miteinander kombinieren???
-- roter Kasten -- Kommentar gestrichen --
|
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. |
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. |
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