2009-07-13 20 views
0

Bitte helfen Sie mir die folgende Abfrage korrigieren:Abfrage Syntaxfehler

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 & "')" 

Problem ist hier:

select max(testid) FROM tbltesting 

andere Optionen? (select max(testid) FROM tbltesting)

Beachten Sie, dass Sie wird SQL-Engine nicht wahrscheinlich Unterabfragen in der INSERT Aussage unterstützen, so sollten Sie stattdessen mit einer INSERT...SELECT Abfrage einfügen:

Antwort

2

Sub-Abfragen in Klammern sollten eingeschlossen.

+0

seine sagt Compile Fehler Argument nicht optional –

1

Entfernen Sie einfach 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'" 

Da Sie 7 Zielfelder haben und 8SELECT Liste Ausdrücke, dies wird nicht kompiliert, bis Sie ein zusätzliches Feld in der Klausel INSERT an, wo Sie Ihre MAX(testid) wollen gehen .

+0

er eine Liste von nicht-ausgewählten Werte hat ... –

+0

@ Jonathan: Es ist durchaus möglich, setzen Sie sie auch in die Auswahlliste – Quassnoi

+0

Könnte bitte die gesamte Abfrage neu schreiben? –

1

Wenn alles funktionieren wird, werden Sie die Unterabfrage innerhalb einer zusätzlichen Schicht aus Klammern einbetten müssen:

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

Beachten Sie, dass Sie SQL Injection Angriffe anfällig sind.


Mit IBM Informix Dynamic Server 11.50 in einer Datenbank mit einer 'Tabelle der Elemente', die folgenden Werke:

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 

Dies stimmt die aktuellen Daten in der Tabelle der Elemente gegeben.

+0

es sagt Kompilieren Fehlerargument nicht optional –

+0

Beachten Sie die Antwort von @onedaywhen: Sie haben eine Diskrepanz zwischen der Anzahl der aufgeführten Spalten und der Anzahl der bereitgestellten Werte. Die Nachricht 'Kompilierfehlerargument nicht optional' könnte mit dieser Nichtübereinstimmung zusammenhängen. –

+0

nein nein ..noch die Abfrage funktioniert nicht ..auch ich gebe die gleiche Anzahl von Spalten –

1

Sie müssen Ihre VALUES-Klausel als SELECT Abfrage umschreiben.

Sie haben sieben Spalten in Ihrer INSERT Klausel und acht in Ihrer VALUES Klausel. Von den Spaltennamen Ich denke, Ihre Unterabfrage

select max(testid) FROM tbltesting 

fehlt ein Ziel. Raten kann es starting_testid genannt werden; auch zu raten Datentypen (Access-Datenbank-Engine ANSI-92-Abfragemodus Syntax):

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; 
+0

Gut gemacht, die Abweichung zwischen der Anzahl der benannten Spalten und der Anzahl der Werte zu erkennen. –

+0

Standard-SQL würde eine GROUP BY-Klausel erfordern, wenn Sie die Aggregat- und die Nicht-Aggregat-Werte in der Auswahlliste mischen. Funktioniert das in M ​​Access - oder MS SQL Server? –

+0

nein nein ..noch die Abfrage funktioniert nicht ..auch ich gebe die gleiche Anzahl von Spalten –

Verwandte Themen