2016-07-25 13 views
0

오픈 액세스 명령을 통해 파이어 버드를 검증하고 있습니다. 유효성 검사를 위해 같은 데이터와 스키마에서 파이어 버드와 오픈 액세스 (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 

파이어, 개방 접속 (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과 데이터 샘플을 제공하고이 쿼리가 수행해야하는 작업을 설명하십시오. 나에게 전혀 이해가되지 않습니다 (사실은 '토큰을 알 수없는'오류를 줄 것입니다. 파이어 버드). –

+0

@MarkRotteveel 삽입 할 행 수가 15 개가 넘습니다. 어떻게 보여줄 수 있습니까? – kvk30

답변

3

어떤 정보가 간단하지 않은 이유, 당신이 가지고있는 데이터를 허용하지 않습니다 반환 될 데이터. 쿼리를 해부하자 :

SELECT EMPNO,SAL 
FROM EMP E 

는 EMP에서 일부 필드를 선택 1 DEPT에서 최대 DEPTNO 동일해야합니다

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

EMP에서 현재 행에 대한 필드 ENAMEAME (주 포함되어있는 경우 그 대소 문자를 구분합니다.)

이는 비교가 하나 1 = null (거짓 null,하지) 또는 것을 의미 - 샘플 데이터 - 1 = 3을 (거짓이다). EMP E의 현재 행의 ENAME어떤ENAME 동일 위치를 최대 DEPTNO를 조회됩니다

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의 최대 같다 EMPNO이 현재 DEPTNODEPT D (여기서는 샘플 데이터가 항상 false 임)과 같습니다.

때문에 항상 null을 수득한다이 질의 - 샘플 데이터 - EMPNO의 값 DEPTNO로부터 분리 된, 그래서 최 쿼리의 결과가 더 행 (수율은 NULL) 없으므로 제 1 내부 질의는 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/ko/3_0/) rlsnotes30.html) 2.5 이후 변경 사항. –

+0

마크, Firebird가 SQL 환경을 생성 할 수 있다면 몇 가지 대안이 있어야할까요? – kvk30

관련 문제