Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Plötzlich neues Feld nach SELECT - Abfrage (https://www.delphipraxis.net/211360-ploetzlich-neues-feld-nach-select-abfrage.html)

Blitzschutz1 3. Sep 2022 19:32

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:
  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;
Im Ergebnis bekomme ich alle Felder beider Tabellen und ein nicht in der Tabelle2 definiertets Feld vst_id_1.

Kann mir einer bei der Beantwortung der Frage helfen, wo dieses Feld herkommt oder wie es entsteht?

Danke Euch!

Delphi.Narium 3. Sep 2022 20:04

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:
 sqlAbfrage := sqlAbfrage +
                ' SELECT tabelle1.*, tabelle2.* ' +
                ' FROM ' +
                ' tabelle1, tabelle2' +
                ' WHERE ' +
                ' tabelle1.ag_id = ' + IntToStr(ADasaId) +
                ' AND ' +
                ' tabelle2.vst_id = ' + IntToStr(ADasaId);
Irgendwie erschließt sich mir hier nicht der Sinn des Konstruktes.

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?

himitsu 3. Sep 2022 23:10

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 *

haentschman 4. Sep 2022 07:58

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:
https://de.wikipedia.org/wiki/SQL-Injection
...besser
Delphi-Quellcode:
 
sqlAbfrage := sqlAbfrage +
              ' SELECT tabelle1.*, tabelle2.* ' +
              ' FROM ' +
              ' tabelle1, tabelle2' +
              ' WHERE ' +
              ' tabelle1.ag_id = :DID' +
              ' AND ' +
              ' tabelle2.vst_id = :DID';
 AQuery.ParamByName('DID').AsInteger := ADasaId;
Das SQL so zusammenzusetzen ist nicht mein Fall...die '' + Orgien. :zwinker: Ist aber Geschmackssache...:wink:

2. mein geliebtes WITH:
Delphi-Quellcode:
 with Result[Length(Result) - 1] do
.
3. nie auf TRUE prüfen:
...besser
Delphi-Quellcode:
if AShowDebug then
.
Zum Thema:
himitsu hat Recht. Deshalb macht man nur in Ausnahmefällen ein select * from. Bei mehreren Tabellen ist es "verboten". :zwinker:

Blitzschutz1 4. Sep 2022 09:56

AW: Plötzlich neues Feld nach SELECT - Abfrage
 
Zitat:

Zitat von haentschman (Beitrag 1511218)
Moin...8-)

Sorry, aber für die Mitlesenden Neulinge...

Der Code ist ein Kandidat für ein umfassendes Refactoring. :wink:

1: SQL keine Parameter:
https://de.wikipedia.org/wiki/SQL-Injection
...besser
Delphi-Quellcode:
 
sqlAbfrage := sqlAbfrage +
              ' SELECT tabelle1.*, tabelle2.* ' +
              ' FROM ' +
              ' tabelle1, tabelle2' +
              ' WHERE ' +
              ' tabelle1.ag_id = :DID' +
              ' AND ' +
              ' tabelle2.vst_id = :DID';
 AQuery.ParamByName('DID').AsInteger := ADasaId;
Das SQL so zusammenzusetzen ist nicht mein Fall...die '' + Orgien. :zwinker: Ist aber Geschmackssache...:wink:

... habe ich im Originalcode drin. Der Einfachheit halber aber hier vor dem Post rausgenommen...

Zitat:

Zitat von himitsu (Beitrag 1511210)
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 *

Danke @himitsu, das wird es wohl sein!

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!

Blitzschutz1 4. Sep 2022 10:03

AW: Plötzlich neues Feld nach SELECT - Abfrage
 
Zitat:

Zitat von haentschman (Beitrag 1511218)
Moin...8-)

3. nie auf TRUE prüfen:
...besser
Delphi-Quellcode:
if AShowDebug then
.

Und warum das falsch ist wollte ich gerade fragen, aber es steht ausführlich hier:
https://www.delphipraxis.net/57121-u...t-boolean.html

Danke @haentschman!

himitsu 4. Sep 2022 15:31

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.
Delphi-Referenz durchsuchenStartsStr(...)
Delphi-Referenz durchsuchenStartsText(...)


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz