2016-07-25 9 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; 

は、

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

Firebirdの、オープンアクセス(SQL)用の出力である火の鳥、Openacess(SQL)は、同じ構造化言語を使用していますが、出力が異なっていても

EMPNO SAL 

Rows selected = 0 

クエリのDDL、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); 

データ、

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とデータのサンプルを提供してください。そして、このクエリが何をすべきかを記述してください。それは私には全く意味がありません(ただし、トークン不明のエラーFirebird)。 –

+0

@ MarkRotteveel挿入する行が15以上あります。それをどのようにあなたに示すことができますか? – kvk30

答えて

3

あなたが任意の情報を得ることはありません理由は簡単です、あなたが持っているデータは、することができません。返されるデータ。

SELECT EMPNO,SAL 
FROM EMP E 

はEMP

現在の行の場合は1が EMPから DEPTから最大 DEPTNOと同じでなければなりません
WHERE 1 = (SELECT MAX(DEPTNO) 
      FROM DEPT D 
      WHERE E.ENAME like '%AME%') 

からいくつかのフィールドを選択し、フィールドをENAMEAMEが含まれている(ということに注意してください。あなたのクエリを分析することができます大文字と小文字が区別されます)。

これは、比較は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の最大値に等しいです:あなたはEMP Eの現在の行のENAME任意最初ENAMEに等しい最大DEPTNOを照会しますEMPNOが現在DEPTNODEPT D(これはサンプルデータが与えられている場合は常にfalse)と等しくなります。

ため常にnullをもたらすこのクエリ - サンプルデータに - EMPNOの値がDEPTNOから分離したあるので、最も内側のクエリの結果がNo行(収率はNULL)でないので、第一の内側のクエリもnullをもたらします。最初の内部クエリが値を返したとしても、EMPNODEPTNOが分離しているため、評価は依然としてfalseになります。

つまり、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/ja/3_0/) rlsnotes30.html)を2.5以降に変更しました。 –

+0

Mark、もしFirebirdがSQL環境を作ることができるなら、それは何か別のものを持っているべきでしょうか? – kvk30

関連する問題