查询语法错误

时间:2009-07-13 12:49:50

标签: sql ms-access vba syntax

请帮我纠正以下问题:

SQL = "insert into tblContract (Empid, Start1, Finish1, Store1, " & _
                    "Start2, Finish2, Store2 ) " & _
      "values ('" & Me.txtEmpNo.Value & _
                    "',select max(testid) FROM tbltesting,'" & _     
                    Me.txtContSunStart1.Value & "', '" & _
                    Me.txtContSunFinish1.Value & "','" & _
                    Me.txtContSunStore1.Value & "','" & _
                    Me.txtContSunStart2.Value & "', '" & _
                    Me.txtContSunFinish2.Value & "','" & _
                    Me.txtContSunStore2.Value & "')"

问题出在这里:

select max(testid) FROM tbltesting

还有其他选择吗?

4 个答案:

答案 0 :(得分:2)

子查询应括在括号中:(select max(testid) FROM tbltesting)

请注意,您的SQL引擎可能不支持INSERT语句中的子查询,因此您应该使用INSERT...SELECT查询进行插入。

答案 1 :(得分:1)

只需删除VALUES

SQL =  "
       INSERT INTO tblContract (Empid, Start1, Finish1, Store1, Start2, Finish2, Store2)
       SELECT " & Me.txtEmpNo.Value & "', MAX(testid), '" &
       Me.txtContSunStart1.Value & "', '" & Me.txtContSunFinish1.Value & "','" & 
       Me.txtContSunStore1.Value & "','" & Me.txtContSunStart2.Value & "', '" & 
       Me.txtContSunFinish2.Value & "','" & Me.txtContSunStore2.Value & "' " &
       "FROM tbltesting'"

由于您有7个目标字段和8 SELECT列表表达式,因此只有在INSERT子句中提供您想要的额外字段时才会编译MAX(testid)去。{/ p>

答案 2 :(得分:1)

如果有什么工作要做,你必须将子查询嵌入一个额外的括号层中:

INSERT INTO SomeTable(Col1, Col2, Col3)
    VALUES(val1, (SELECT MAX(testid) FROM tbltesting), val3);

请注意,您很容易受到SQL Injection攻击。


在具有“元素表”的数据库中使用IBM Informix Dynamic Server 11.50,以下工作:

create temp table t(i integer, j integer, k integer);
insert into t values(1, (select max(atomic_number) from elements), 2);
select * from t;

1   118     2

鉴于元素表中的当前数据,这是正确的。

答案 3 :(得分:1)

您需要将VALUES子句重新编写为SELECT查询。

您的INSERT子句中有七列,VALUES子句中有八列。从列名称我猜你的子查询

select max(testid) FROM tbltesting

缺少目的地。猜它可能被称为starting_testid;还猜测数据类型(Access数据库引擎ANSI-92查询模式语法):

CREATE PROCEDURE AddContract
(
 :Empid INTEGER, 
 :Start1 DATETIME, 
 :Finish1 DATETIME,
 :Store1 VARCHAR(20), 
 :Start2 DATETIME,
 :Finish2 DATETIME,
 :Store2 VARCHAR(20)
)
AS
insert into tblContract 
( 
 Empid, starting_testid, 
 Start1, Finish1, Store1, 
 Start2, Finish2, Store2
)
SELECT :Empid, max(testid), 
       :Start1, :Finish1, :Store1, 
       :Start2, :Finish2, :Store2
  FROM tbltesting;