2016-07-25 20 views
1

Diese Abfrage wirft einen Fehler auf Firebird, wie diesen Fehler zu beheben?Fehler "Token unbekannt" in Firebird

SELECT EMPNO,SAL 
     FROM EMP E 
     where EMPNO = (SELECT MAX(DEPTNO) FROM DEPT D WHERE E.ENAME NOT like (SELECT TOP 1 ENAME 
                       FROM emp E1 
                       WHERE E1.EMPNO=D.DEPTNO)) 
     OR 1 = (SELECT MAX(DEPTNO) 
       FROM DEPT D 
       WHERE E.ENAME like substring('NAME111',1,5)) ORDER BY EMPNO; 

Hier ist der Fehler.

die folgende Fehlerinformation beschreibt das Scheitern

ODBC-Aufruf = SQLPrepareW()

SQL State = HY000

Mutter error = -104 (FFFFFF98)

Fehlermeldung = [ODBC Firebird Treiber] [Firebird] Dynamischer SQL-Fehler

SQL-Fehlercode = -104

Token unbekannt - Zeile 1, Spalte 111

Antwort

5

(Edit aufzunehmen alternative, modernere Syntax von Kommentaren)

Statt SELECT TOP 1 ENAME, verwenden Sie eine der folgenden :

  • SELECT ENAME ...FETCH FIRST ROW ONLY (SQL: 2008, Firebird 3+)
  • SELECT ENAME ...ROWS 1 (non-standard, Firebird 2+)
  • SELECTFIRST 1ENAME ... (Nicht-Standard, wirksam Firebird 1.5+)

Außerdem verwenden

substring('NAME111' from 1 for 5) 

anstelle von

substring('NAME111',1,5) 

Zum Beispiel mit FIRST 1:

SELECT EMPNO,SAL 
    FROM EMP E 
    WHERE EMPNO = (SELECT MAX(DEPTNO) 
         FROM DEPT D 
         WHERE E.ENAME NOT LIKE (SELECT FIRST 1 ENAME 
                FROM emp E1 
                WHERE E1.EMPNO=D.DEPTN O)) 
     OR 1 = (SELECT MAX(DEPTNO) 
        FROM DEPT D 
        WHERE E.ENAME LIKE substring('NAME111 ' from 1 for 5)) 
    ORDER BY EMPNO; 
+0

Keine Änderung im Fehler – kvk30

+0

gleiche Spalte? siehe Edits –

+2

@ kvk30: "aber für SQL ist nicht leer" macht keinen Sinn. Firebird verwendet SQL als Abfragesprache. Alles, was Sie in Firebird schreiben ** ist ** "SQL" –