Adam_Code
Adam_Code

Reputation: 35

Syntax error in SQL FROM clause

I think my syntax is correct. Whats wrong with my syntax? I need to use it as search item.

But still it shows the error

Syntax error in FROM clause

procedure TForm9.Button1Click(Sender: TObject);
begin
 ADOQuery1.Close;

ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add ('SELECT DAT20303.NUM,DAT20303.NAMA,DAT20303.MATRIC_ID,DAT20303.SUBJEK,DAT20303.M1,DAT20303.M2,DAT20303.M3,DAT20303.M4,DAT20303.M5,DAT20303.M6,DAT20303.M7, STUDENT.SEKSYEN,STUDENT.MATRIC_ID');
 ADOQuery1.SQL.Add ('FROM STUDENT');
 ADOQuery1.SQL.Add ('JOIN DAT20303');
 ADOQuery1.SQL.Add ('ON DAT20303.MATRIC_ID = STUDENT.MATRIC_ID');
 ADOQuery1.SQL.Add ('WHERE SEKSYEN = ' + ComboBox2.Text);



ADOQuery1.Open; {open query + display data}
end;

Upvotes: 0

Views: 2078

Answers (2)

Ken White
Ken White

Reputation: 125689

Do you in fact have a STUDENT table? You refer to both STUDENT and LSTUDENT in your SELECT, but only use STUDENT in the FROM clause. Which one is it?

Also, at a minimum, you need to quote the content of your WHERE condition.

ADOQuery1.SQL.Add ('WHERE SEKSYEN = ' + QuotedStr(ComboBox2.Text));

Much better though would be to stop concatenating SQL in your code, and use parameterized queries instead. It's not only much safer against SQL injection, but it allows the database engine to compile and cache the query content, making it execute much more quickly if you're using the same statement more than one time with different parameter values.

procedure TForm9.Button1Click(Sender: TObject);
begin
  ADOQuery1.Close;

  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT DAT20303.NUM, DAT20303.NAMA, DAT20303.MATRIC_ID,');
  ADOQuery1.SQL.Add('DAT20303.SUBJEK, DAT20303.M1, DAT20303.M2, DAT20303.M3,');   
  ADOQuery1.SQL.Add('DAT20303.M4, DAT20303.M5, DAT20303.M6,');    
  ADOQuery1.SQL.Add('DAT20303.M7, STUDENT.SEKSYEN, LSTUDENT.MATRIC_ID');
  ADOQuery1.SQL.Add ('FROM STUDENT');
  ADOQuery1.SQL.Add ('JOIN DAT20303');
  ADOQuery1.SQL.Add ('ON DAT20303.MATRIC_ID = STUDENT.MATRIC_ID');
  ADOQuery1.SQL.Add ('WHERE SEKSYEN = :SekSyen');
  ADOQuery1.Parameters.ParamByName('SekSyen').AsString := ComboBox1.Text;
  ADOQuery1.Open; {open query + display data}
end;

And please don't be afraid to use whitespace (spaces and line breaks) to make your SQL more readable! I've cleaned it up somewhat in my answer to do so. When it's easier to read, it's easier to understand (and maintain later).

Upvotes: 4

Sir Rufo
Sir Rufo

Reputation: 19106

You must not use only JOIN within your query.

This

SELECT *
FROM STUDENT
  JOIN DAT20303 ON DAT20303.MATRIC_ID = STUDENT.MATRIC_ID

leads to

Syntax error in FROM clause

but this will do fine

SELECT *
FROM STUDENT
  LEFT JOIN DAT20303 ON DAT20303.MATRIC_ID = STUDENT.MATRIC_ID

or this one

SELECT *
FROM STUDENT
  INNER JOIN DAT20303 ON DAT20303.MATRIC_ID = STUDENT.MATRIC_ID

Also have a look at this question here on SO

Upvotes: 4

Related Questions