2016-07-25 44 views
1

此查询在firebird上抛出错误,如何解决该错误?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; 

这是错误。

以下错误信息描述了故障

ODBC调用= SQLPrepareW()

SQL状态= HY000

本机错误= -104(FFFFFF98)

错误信息= [ODBC Firebird驱动程序] [Firebird]动态SQL错误

SQL错误代码= -104

令牌未知 - 线1,列111

回答

5

(编辑以包括替代方案中,更现代的语法从评论)

代替SELECT TOP 1 ENAME,使用下列的:

  • SELECT ENAME ...FETCH FIRST ROW ONLY(SQL:2008年,火鸟3+)
  • SELECT ENAME ...ROWS 1(非标准,火鸟2+)
  • SELECTFIRST 1ENAME ...(非标,有效火鸟1.5+)

此外,使用

substring('NAME111' from 1 for 5) 

代替

substring('NAME111',1,5) 

例如,使用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

没有变化的错误 – kvk30

+0

同列?请参阅编辑 –

+2

@ kvk30:“但对于SQL非空”是没有意义的。 Firebird使用SQL作为其查询语言。所以你在Firebird **写的任何内容都是**“SQL” –