AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Plötzlich neues Feld nach SELECT - Abfrage
Thema durchsuchen
Ansicht
Themen-Optionen

Plötzlich neues Feld nach SELECT - Abfrage

Ein Thema von Blitzschutz1 · begonnen am 3. Sep 2022 · letzter Beitrag vom 4. Sep 2022
Antwort Antwort
Blitzschutz1

Registriert seit: 2. Dez 2011
Ort: Vogtland (über Bayern)
26 Beiträge
 
Delphi 10.4 Sydney
 
#1

Plötzlich neues Feld nach SELECT - Abfrage

  Alt 3. Sep 2022, 20:32
Datenbank: MariaDB • Version: 10.4.21 • Zugriff über: ZEOS DBO
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!
Wenn die Klugen nachgeben geschieht das was die Dummen wollen!
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#2

AW: Plötzlich neues Feld nach SELECT - Abfrage

  Alt 3. Sep 2022, 21:04
Ohne zu wissen, wie denn die existierenden Felder der Tabellen 1 und 2 heißen, wird das eher was für die

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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Plötzlich neues Feld nach SELECT - Abfrage

  Alt 4. Sep 2022, 00:10
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 *
$2B or not $2B

Geändert von himitsu ( 4. Sep 2022 um 00:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#4

AW: Plötzlich neues Feld nach SELECT - Abfrage

  Alt 4. Sep 2022, 08:58
Moin...

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

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

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. Ist aber Geschmackssache...

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".

Geändert von haentschman ( 4. Sep 2022 um 09:09 Uhr)
  Mit Zitat antworten Zitat
Blitzschutz1

Registriert seit: 2. Dez 2011
Ort: Vogtland (über Bayern)
26 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Plötzlich neues Feld nach SELECT - Abfrage

  Alt 4. Sep 2022, 10:56
Moin...

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

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

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. Ist aber Geschmackssache...
... habe ich im Originalcode drin. Der Einfachheit halber aber hier vor dem Post rausgenommen...

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!
Wenn die Klugen nachgeben geschieht das was die Dummen wollen!
  Mit Zitat antworten Zitat
Blitzschutz1

Registriert seit: 2. Dez 2011
Ort: Vogtland (über Bayern)
26 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Plötzlich neues Feld nach SELECT - Abfrage

  Alt 4. Sep 2022, 11:03
Moin...

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!
Wenn die Klugen nachgeben geschieht das was die Dummen wollen!

Geändert von Blitzschutz1 ( 4. Sep 2022 um 11:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Plötzlich neues Feld nach SELECT - Abfrage

  Alt 4. Sep 2022, 16:31
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(...)
$2B or not $2B
  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 02:11 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