数据输出因不同服务器中的同一查询而异

时间:2016-07-25 12:07:37

标签: sql firebird

我正在通过开放访问命令验证firebird。为了验证, 我在相同的数据和模式上对firebird和开放访问(SQL)使用相同的命令。当我在SQL上运行此查询时,它正在工作。如果是组查询,则不显示所需的输出。 firebird如何评估相关查询?

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

即使Firebird,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);

1 个答案:

答案 0 :(得分:3)

您没有获得任何信息的原因很简单,您拥有的数据不允许返回任何数据。让我们剖析你的问题:

SELECT EMPNO,SAL
FROM EMP E 

从emp

中选择一些字段
WHERE 1 = (SELECT MAX(DEPTNO) 
           FROM DEPT D 
           WHERE E.ENAME like '%AME%') 

其中1必须等于DEPTNO的最大DEPT,如果来自EMP的当前行,则ENAME字段包含AME(请注意,区分大小写。)

这意味着比较是1 = nullnull,而不是假)或 - 与您的示例数据 - 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等于DEPTNO的{​​{1}}的最大值,其中包含一个没有意义的复杂查询:您正在查询{{1}的最大DEPT当前行DEPTNO等于任何第一ENAME,其中EMP E等于ENAME EMPNO 1}}(给定样本数据总是假的)。

此查询将始终产生DEPTNO,因为 - 在示例数据中 - DEPT D中的值与null是不相关的,因此最内层查询的结果为无行(产生null) ),因此第一个内部查询也将产生EMPNO。即使第一个内部查询返回了一个值,评估仍然是错误的,因为DEPTNOnull是分离的。

换句话说,EMPNO - 子句等同于DEPTNO,它不产生任何行。

我不知道开放访问是什么(因为快速搜索没有透露任何名称),但它似乎对SQL查询有非常奇怪的评估规则。

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