我认为我的语法是正确的。我的语法有什么问题?我需要将它用作搜索项目。
但仍显示错误
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;
答案 0 :(得分:4)
你实际上有一张STUDENT
牌桌吗?您在STUDENT
中引用LSTUDENT
和SELECT
,但仅在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