SQL FROM子句中的语法错误

时间:2014-05-13 12:33:50

标签: sql delphi ms-access ado

我认为我的语法是正确的。我的语法有什么问题?我需要将它用作搜索项目。

但仍显示错误

  

FROM子句中的语法错误

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;

2 个答案:

答案 0 :(得分:4)

你实际上有一张STUDENT牌桌吗?您在STUDENT中引用LSTUDENTSELECT,但仅在STUDENT子句中使用FROM。它是哪一个?

此外,您至少需要引用WHERE条件的内容。

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

好多了虽然会停止在代码中连接SQL ,而是使用参数化查询。它不仅对SQL injection更安全,而且它允许数据库引擎编译和缓存查询内容,如果你使用不同参数值多次使用相同的语句,它会更快地执行。 / p>

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;

并且不要害怕使用空格(空格和换行符)来使您的SQL更具可读性!在我的回答中,我已经将它清理干净了。当它更容易阅读时,它更容易理解(并在以后维护)。

答案 1 :(得分:4)

您不得在查询中仅使用JOIN

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

导致

  

FROM子句中的语法错误

但这样做会很好

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

或者这个

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

另请参阅SO {/ p>上的this question