![]() |
Datenbank: MariaDB • Version: 10.4.21 • Zugriff über: ZEOS DBO
Plötzlich neues Feld nach SELECT - Abfrage
Guten Abend!
Nachdem ich jetzt stundenlang gesucht habe, ich aber zu keinem Ergebnis komme, meine Frage: Woher nimmt MariaDB im Ergebnis folgender Abfrage das neue Feld "vst_id_1"?
Code:
Im Ergebnis bekomme ich alle Felder beider Tabellen und ein nicht in der Tabelle2 definiertets Feld vst_id_1.
sqlAbfrage := sqlAbfrage +
' SELECT tabelle1.*, tabelle2.* ' + ' FROM ' + ' tabelle1, tabelle2' + ' WHERE ' + ' tabelle1.ag_id = ' + IntToStr(ADasaId) + ' AND ' + ' tabelle2.vst_id = ' + IntToStr(ADasaId); AQuery.Open; if AQuery.RecordCount > 0 then begin if AQuery.FieldCount > 0 then begin for f := 0 to AQuery.FieldCount - 1 do begin SetLength(Result, Length(Result) + 1); with Result[Length(Result) - 1] do begin if Pos('ag_', AQuery.Fields[f].FullName) > 0 then begin Tabelle := 'tabelle1'; end else if Pos('vst_', AQuery.Fields[f].FullName) > 0 then begin Tabelle := 'tabelle2'; end else begin Tabelle := 'nicht_ermittelt'; end; Feldname := AQuery.Fields[f].FullName; if AShowDebug = true then begin showMessage('Index: ' + IntToStr(f) + 'Feldname: ' + Feldname); end; Feldwert := AQuery.Fields[f].AsString; IsStringField := true; ComponentName := ''; ComponentType := ''; Options := ''; end; end; end; end; Kann mir einer bei der Beantwortung der Frage helfen, wo dieses Feld herkommt oder wie es entsteht? Danke Euch! |
AW: Plötzlich neues Feld nach SELECT - Abfrage
Ohne zu wissen, wie denn die existierenden Felder der Tabellen 1 und 2 heißen, wird das eher was für die :glaskugel:
Was steht denn hier in der Variabel sqlAbfrage direkt hinter dem :=?
Delphi-Quellcode:
Irgendwie erschließt sich mir hier nicht der Sinn des Konstruktes.
sqlAbfrage := sqlAbfrage +
' SELECT tabelle1.*, tabelle2.* ' + ' FROM ' + ' tabelle1, tabelle2' + ' WHERE ' + ' tabelle1.ag_id = ' + IntToStr(ADasaId) + ' AND ' + ' tabelle2.vst_id = ' + IntToStr(ADasaId); Sollte die Tabelle1 ebenfalls über eine Spalte vst_id verfügen, so wird von der DB automatisch dafür gesorgt, dass die Ergebnismenge keine doppelten Spaltennamen enthält, ja nach DB erfolgt dies durch anhängen eines _ und einer laufenden Nummerierung, beginnen mit 1, was hier dann dazu führt, dass die Tabelle 2 über eine Spalte vst_id_1 verfügt. Über welchen Teil der Abfrage wird denn die Verbindung zwischen Tabelle 1 und Tabelle 2 hergestellt? Gibt es hier irgendeine Fremdschlüsselbeziehung? Wie wird diese abgebildet? Oder ist es beabsichtigt, dass die Ergebnismenge im Ansatz einem kartesischen Produkt nahe kommen kann? |
AW: Plötzlich neues Feld nach SELECT - Abfrage
vst_id ist bestimmt zwei Mal im Select
und da Namen eindeutig sind, wird hier einfach hochgezählt. Ist wie das selbe Feld, nur quasi mit AS umbenannt. hier kann es nur aus beiden Tabellen kommen, aber es passiert auch gern, wenn man Felder explizit drin hat und zusätzlich noch einmal das * |
AW: Plötzlich neues Feld nach SELECT - Abfrage
Moin...8-)
Sorry, aber für die Mitlesenden Neulinge... Der Code ist ein Kandidat für ein umfassendes Refactoring. :wink: 1: SQL keine Parameter: ![]() ...besser
Delphi-Quellcode:
Das SQL so zusammenzusetzen ist nicht mein Fall...die '' + Orgien. :zwinker: Ist aber Geschmackssache...:wink:sqlAbfrage := sqlAbfrage + ' SELECT tabelle1.*, tabelle2.* ' + ' FROM ' + ' tabelle1, tabelle2' + ' WHERE ' + ' tabelle1.ag_id = :DID' + ' AND ' + ' tabelle2.vst_id = :DID'; AQuery.ParamByName('DID').AsInteger := ADasaId; 2. mein geliebtes WITH:
Delphi-Quellcode:
3. nie auf TRUE prüfen:
with Result[Length(Result) - 1] do
. ...besser
Delphi-Quellcode:
Zum Thema:
if AShowDebug then
. himitsu hat Recht. Deshalb macht man nur in Ausnahmefällen ein select * from. Bei mehreren Tabellen ist es "verboten". :zwinker: |
AW: Plötzlich neues Feld nach SELECT - Abfrage
Zitat:
Zitat:
Ich habe das Feld vst_id einmal in Tabelle1 als ganz normales Integer-Feld (dahinein kommt nach erfolgreichem Eintrag des zugehörigen Dasa in Tabelle2 die dort im Feld vst_id (PK) erzeugte Datensatz-ID). Und das andere Mal, wie gerade geschrieben, in Tabelle2 als Pk-Feld. Nun war ich immer der Meinung, dass die Zuordnung über Tabellenname.Feldname eindeutig wäre und es egal ist, ob zwei Felder in unterschiedlichen Tabellen gleiche Namen haben. Offensichtlich falsch, also setzen 5 und lernen! Ich werde Euren Rat befolgen und die Abfrage umbauen (also ohne *). Schönen Sonntag! |
AW: Plötzlich neues Feld nach SELECT - Abfrage
Zitat:
![]() Danke @haentschman! |
AW: Plötzlich neues Feld nach SELECT - Abfrage
Und "irgendwo" im Namen ist wohl auch nicht ganz richtig? (tag_abc oder iwui_dasag_sa)
if Pos('ag_', AQuery.Fields[f].FullName) > 0 then Pos(...) = 1 oder besser noch "sprechenden" Code verwenden, der direkt sagt, was er macht. ![]() ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:04 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