Ошибка синтаксиса запроса - PullRequest
0 голосов
/ 13 июля 2009

Пожалуйста, помогите мне исправить следующий запрос:

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 ]

2 голосов
/ 13 июля 2009

Подзапросы должны быть заключены в скобки: (select max(testid) FROM tbltesting)

Обратите внимание, что ваш движок SQL, вероятно, не будет поддерживать подзапросы в операторе INSERT, поэтому вы должны вставить вместо него запрос INSERT...SELECT.

1 голос
/ 13 июля 2009

Вам необходимо переписать предложение VALUES как запрос SELECT.

У вас есть семь столбцов в вашем предложении INSERT и восемь в вашем предложении VALUES. По названиям столбцов я угадываю твой подзапрос

select max(testid) FROM tbltesting

отсутствует пункт назначения. Угадай, это можно назвать starting_testid; также угадывает типы данных (синтаксис режима запросов ANSI-92 ядра базы данных Access):

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;
1 голос
/ 13 июля 2009

Если что-то сработает, вам нужно будет вставить подзапрос в дополнительный слой скобок:

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

Имейте в виду, что вы уязвимы для SQL-инъекций атак.


Используя 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

Это правильно, учитывая текущие данные в таблице элементов.

1 голос
/ 13 июля 2009

Просто удалите 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) пошел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...