2016-07-25 56 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