2016-07-25 50 views
0

我通过开放访问命令验证了firebird。对于验证, 我对相同的数据和模式使用相同的命令来进行firebird和开放访问(SQL)。当我在SQL上运行这个查询时,它正在工作。在组查询的情况下,它不显示所需的输出。火鸟如何评估相关查询?现有数据没有记录

SELECT EMPNO,SAL 
FROM EMP E 
WHERE 1 = (SELECT MAX(DEPTNO) 
      FROM DEPT D 
      WHERE E.ENAME like '%AME%') 
OR EMPNO = (SELECT MAX(DEPTNO) 
      FROM DEPT D 
      WHERE E.ENAME like (SELECT TOP 1 ENAME 
           FROM emp E1 
           WHERE E1.EMPNO=D.DEPTNO)) 
ORDER BY EMPNO; 

这里是开放存取(SQL)的输出,

EMPNO SAL 
-15 3000  
-12 2000  
-11 100500.55 
-10 NULL  
-9 1111.11 
-8 -3000 
-6 NULL  
    ......... 
    ......... 
Rows selected = 27 

火鸟,

EMPNO SAL 

Rows selected = 0 

即使火鸟,Openacess(SQL)使用相同的结构化语言,但在输出不同。

DDL查询,

CREATE TABLE EMP(EMPNO integer , ENAME varchar(32) , JOB varchar(32) , HIREDATE datetime , SAL float ,COMM real ,DEPTNO integer); 
CREATE TABLE DEPT(DEPTNO integer, DNAME varchar(40), LOC varchar(40), DIVNO integer); 

数据上面DDL,

INSERT INTO EMP VALUES(101, 'NAME1', 'TITLE1', '1990-02-02 02:02:02', 100500.55, 2000.90, 1); 
INSERT INTO EMP VALUES (102,'NAME2','TITLE2', '1958-02-02 02:02:02',2000.00, 20000.00, 1); 
INSERT INTO EMP VALUES(103, 'NAME3', 'TITLE3', '1997-03-12 08:09:54', 3000.00, 1000.50, 2); 
INSERT INTO EMP VALUES(104, 'NAME4', 'TITLE4', '1997-04-02 00:00:00', 1111.11, 2.22, 1); 
INSERT INTO EMP VALUES(105, 'NAME5', 'TITLE5', '1997-06-12 08:09:54', 3000.00, 1000.50, 2); 
INSERT INTO EMP VALUES(106, 'NAME6', 'TITLE6', '1997-06-12 02:02:02', 1111.11, 2.22, 1); 
INSERT INTO DEPT (DEPTNO, DNAME, LOC, DIVNO) Values (1, 'Software', 'San Jose', 10); 
INSERT INTO DEPT (DEPTNO, DNAME, LOC, DIVNO) Values (2, 'Sales', 'LA', 20); 
INSERT INTO DEPT (DEPTNO, DNAME, LOC, DIVNO) Values (3, 'Marketing', 'LA', 20); 
+0

请格式化查询,使其可读(该查询对我来说没有意义)。同时发布一个可重现的例子:包括DDL和一个数据样本。你是否检查过一个简单的'select * from emp'返回任何数据,并且这些子查询产生了预期的结果,这样做外层查询将产生任何东西。 –

+0

请提供所涉及的表的DDL和一个数据样本,并描述这个查询应该做什么,因为它对我来说毫无意义(除了它会给出一个'标记未知'的错误火鸟)。 –

+0

@MarkRotteveel它有超过15行插入。我如何向你展示? – kvk30

回答

3

,你没有得到任何信息很简单的原因,你有数据不允许任何要返回的数据。让我们仔细分析查询:

SELECT EMPNO,SAL 
FROM EMP E 

从EMP选择一些领域

WHERE 1 = (SELECT MAX(DEPTNO) 
      FROM DEPT D 
      WHERE E.ENAME like '%AME%') 

其中1必须等于最大DEPTNODEPT如果从EMP当前行领域ENAME包含AME(注意,这是区分大小写的)。

这意味着比较要么是1 = null(这是null,而不是假)或者 - 与您的样本数据 - 1 = 3(这是错误的)。

OR EMPNO = (SELECT MAX(DEPTNO) 
      FROM DEPT D 
      WHERE E.ENAME like (SELECT TOP 1 ENAME 
           FROM emp E1 
           WHERE E1.EMPNO=D.DEPTNO)) 

或者EMPNO等于最大的DEPTDEPTNO一个令人费解的查询是没有意义的:要查询的最大DEPTNO其中EMP E当前行的ENAME等于任何第一ENAME其中EMPNO等于DEPT D的当前DEPTNO(其中给定样本数据总是为假)。

该查询将总是产生null因为 - 在采样数据 - 在EMPNO的值是从DEPTNO分离的,所以最内侧的查询的结果是没有行(生成NULL),因此所述第一内查询还将产生null 。即使第一个内部查询已返回值,评估仍然是错误的,因为EMPNODEPTNO不相交。

换句话说,WHERE条款相当于WHERE FALSE OR NULL,它不产生行。

我不知道开放存取是什么(因为快速搜索没有揭示任何称谓),但它似乎有非常奇怪的SQL查询的评估规则。

由于我不明白这个查询试图检索什么,我也不能为您提供一个有效的查询。

+0

谢谢,我可以得到firebird3.0的文档链接。 – kvk30

+0

@ kvk30请注意,这并不是Firebird特有的,这个答案适用于任何正常的RDBMS; Firebird 3的文档是[Firebird 2.5语言参考](http://www.firebirdsq l.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25.html)和[Firebird 3.0发行说明](http://www.firebirdsql.org/file/documentation/release_notes/html/en/3_0/ rlsnotes30.html)自2.5以来的更改。 –

+0

马克,如果Firebird可以创建SQL环境,那么它应该有一些选择,对吧? – kvk30