![]() |
Datenbank: MySql • Version: 5.0.x • Zugriff über: dbexpress
Unknown column bei TSQLQuery auf zwei Tabellen (Left join)
Hallo, ich bin von Zeos/Delphi 2007 auf dbexpress/Delphi 2009 umgestiegen und nun bald am verzweifeln, ich hoffe mir kann von Euch jemand helfen!
Folgendes kleines SQL Statement liefert mir eine Exception unter Delphi 2009, funktioniert aber prima mit dem mysql Client aber auch mit dem in Delphi integrierten Datenexplorer. Der Fehler tritt nur auf wenn ich zwei Tabellen verbinde (hier ein Left Join). Als Fehlermeldung kommt "Unknown column rights.rightID in Where clause". Das Feld rights.rightID gibt es aber in der Tabelle rights. Der Fehler kommt auch nur bei einer TSQLQuery bei einer TSQLSimpleDataSet Abfrage funktioniert es ebenfalls ohne Fehler.
Delphi-Quellcode:
Vielen Dank
procedure TForm2.Button1Click(Sender: TObject);
begin SQLquery1.SQL.Text:='SELECT allocrights.rightID, rights.rightID, allocrights.userID FROM allocrights, rights WHERE allocrights.rightID=rights.rightID'; SQLquery1.Open; Memo1.Lines.Add(SQLquery1.Text); Memo1.Lines.Add(IntToStr(SQLquery1.RecordCount)); <==== Exception mit Fehler "Unknown column rights.rightID SQLquery1.Close; end; Michael [edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit] |
Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
Wird vielleicht Groß-/Kleinschreibung unterschieden
BTW: Ich würde mit Tabellenaliasen arbeiten
SQL-Code:
SELECT
a.rightID, r.rightID, a.userID FROM allocrights a, rights r WHERE a.rightID=r.rightID; |
Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
Hallo,
ich würde eh die "neue" Syntax nehmen
SQL-Code:
SELECT
allocrights.rightID, rights.rightID, allocrights.userID FROM allocrights JOIN rights on allocrights.rightID=rights.rightID Ev. heisst das bei MySQL auch INNER JOIN. Sie auch hier: ![]() Aber so nebenbei, die alte Join-Syntax sollte trotzdem gehen. Heiko |
Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
Zitat:
SQL-Code:
;
SELECT *
FROM allocrights JOIN rights ON allocrights.rightID=rights.rightID WHERE allocrights.userID=5910 And rights.sysID=23; |
Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
Hallo, es muss sich wohl um einen Fehler in Delphi 2009 handeln, da meine Datenbank nur folgendes Kommando bekommt.
SQL-Code:
und nicht
SELECT * FROM allocrights
SQL-Code:
Hat den jemand schon mal erfolgreich ein SQL Select Statement auf zwei Tabellen mit einer TSQLQuery abgesetzt?
SELECT * FROM allocrights, rights
Vielen Dank! |
Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
Müsste imho auch
SQL-Code:
Wie gesagt machen Tabellenaliases da ganze übersichtlicher
SELECT allocrights.*, rights.* FROM allocrights, rights;
|
Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
Hallo,
liegt viell. am DBExpress. Hier gab es auch Probleme. siehe letzter Eintrag. ![]() Heiko |
Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
Zitat:
Der Fehler wandert sogar mit, wenn ich
SQL-Code:
ausführe kommt Unknown column a.rightID
SELECT a.*, r.*
FROM rights r, allocrights a WHERE a.rightID=r.rightID AND a.userID=5910 And r.sysID=23; Der Fehler wandert sogar mit, wenn ich
SQL-Code:
ausführe kommt Unknown column r.rightID
SELECT a.*, r.*
FROM allocrights a, rights r, WHERE a.rightID=r.rightID AND a.userID=5910 And r.sysID=23; d.h. je nachdem welche Tabelle an zweiter Stelle steht wird abgeschnitten und der MySQL Server bringt dann natürlich einen Fehler. |
Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
Zitat:
Denn eine TSQLQuery muss den SQL-Ausdruck parsen um das "Count(*)" an der richtigen Stelle einfügen zu können. Und dieser Parser ist komplett überfordert, wenn er auf einen JOIN trifft. Zudem wird unter bestimmten Umständen auch mal die gesamte WHERE Klausel weggelassen, was dann natürlich zu völlig falschen Daten führt. Also besser einen eigenen "SELECT COUNT(*)" abfeuern. Damit ist man auf der sicheren Seite. |
Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
Zitat:
Ich werde als Delphi 2009 Kunde dazu ein Ticket bei embarcadero aufmachen, die sollen das mal endlich fixen.
SQL-Code:
SELECT COUNT(*) FROM rights, allocrights WHERE allocrights.rightID=rights.rightID AND allocrights.userID=5910 And rights.sysID=23;
Delphi-Quellcode:
[edit=mkinzler]Delphi-Tag ergänzt Mfg, mkinzler[/edit]
SQLquery1.Open;
Memo1.Lines.Add(IntToStr(SQLquery1.FieldByName('count(*)').AsInteger)); SQLquery1.Close; |
Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
Gleichnamige Felder sind verboten: :warn:
SQL-Code:
Abfragen, die potentiell gleichnamige Felder produzieren können, sind ebenfalls verboten:
SELECT allocrights.rightID, rights.rightID, ... FROM ...
SQL-Code:
SELECT * FROM allocrights, rights WHERE ...
SQL-Code:
Erlaubt ist dagegen folgende Abfrage:
SELECT allocrights.*, rights.* FROM allocrights, rights WHERE ...
SQL-Code:
Wie man sieht, darf man für eine Tabelle den *-Platzhalter verwenden.
SELECT allocrights.*, rights.RightName FROM allocrights, rights WHERE ...
Alle anderen Felder muss man einzeln in der Feldliste angeben und sicherstellen, dass gleichnamige Felder nicht auftreten. Mit dem AS-Operator kann man gleichnamige Felder verhindern:
SQL-Code:
SELECT allocrights.rightID, rights.rightID AS r_rightID, ... FROM ...
DBMS haben bestimmte Strategien, falls gleichnamige Felder auftreten: * an Feldname wird eine laufende Nummer angehängt (rightID, rightID1, rightID2, ...) * Feldname wird vollqualifiziert indem der Tabellenname vorne angehängt wird * in der Ergebnismenge kommen die Felder mehrfach vor (was die Anwendung vor unlösbare Probleme stellt) * es wird ein Fehler ausgelöst Da jedes DBMS etwas anderst reagiert, gibt es nur den Weg, grundsätzlich alle Abfragen so zu schreiben, dass gleichnamige Felder nie auftreten können. |
Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
Zitat:
SQL-Code:
SELECT COUNT(*) AS RecordAnzahl FROM rights, allocrights WHERE allocrights.rightID=rights.rightID AND allocrights.userID=5910 And rights.sysID=23;
Delphi-Quellcode:
Man darf nicht einfach SELECT COUNT(*) FROM irgendwas schreiben und dann darauf vertrauen, dass das Feld "COUNT(*)" heisst.
SQLquery1.Open;
Memo1.Lines.Add(IntToStr(SQLquery1.FieldByName('RecordAnzahl').AsInteger)); SQLquery1.Close; Der Feldname ist potentiell völlig undefiniert. Jedes DBMS handhabt das etwas anderst. Man darf hier nicht auf ein bestimmtes Namensschema vertrauen. Das gilt natürlich auch für MIN(), MAX(), ARG(), SUM() und alle anderen SQL-Funktionen. Entweder man wendet den AS-Operator wie oben im Beispiel an oder man fragt so ab:
Delphi-Quellcode:
Memo1.Lines.Add(IntToStr(SQLquery1.Fields[0].AsInteger));
|
Re: Unknown column bei TSQLQuery auf zwei Tabellen (Left joi
Ja danke, aber mit Bug meinte ich RecordCount, die Eigenschaft sollte schon das richtige Ergebnis zurückliefern.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:36 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 by Thomas Breitkreuz