2016-07-25 25 views
0

Ich validiere Firebird über Open-Access-Befehle. Für die Validierung, Ich benutze die gleichen Befehle für beide Firebird und Open Access (SQL) über die gleichen Daten und Schema. Wenn ich diese Abfrage auf SQL ausgeführt habe, funktioniert es. Im Falle von Gruppenabfragen zeigt es nicht die gewünschte Ausgabe an. Wie prüft Firebird eine korrelierte Abfrage?Keine Datensätze für vorhandene Daten

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; 

Hier sind die Ausgaben für den offenen Zugang (SQL),

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

Firebird,

EMPNO SAL 

Rows selected = 0 

Obwohl Firebird, Openacess (SQL) gleiche strukturierte Sprache verwendet, unterscheiden sich aber in den Ausgaben .

DDL der Abfrage,

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); 

Daten für über 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

Bitte formatieren Sie die Abfrage so, dass sie lesbar ist (diese Abfrage ergibt für mich keinen Sinn BTW). Veröffentlichen Sie auch ein reproduzierbares Beispiel: Fügen Sie die DDL und ein Beispiel der Daten hinzu. Haben Sie überprüft, dass ein einfaches 'select * from emp 'irgendwelche Daten zurückgibt, und dass diese Unterabfragen die erwarteten Ergebnisse erzeugen, machen Sie, dass die äußere Abfrage irgendetwas erzeugt. –

+0

Bitte geben Sie die DDL der beteiligten Tabellen und eine Stichprobe der Daten an und beschreiben Sie, was diese Abfrage tun soll, da sie für mich überhaupt keinen Sinn ergibt (abgesehen von der Tatsache, dass sie einen "token unknown" -Fehler enthält) Feuervogel). –

+0

@MarkRotteveel Es müssen mehr als 15 Zeilen eingefügt werden. Wie kann ich dir das zeigen? – kvk30

Antwort

3

Die Gründe, dass Sie keine Informationen ist einfach bekommt man die Daten nicht zulässt alle Daten, die zurückgegeben werden sollen. Lässt sezieren Anfrage: wenn für die aktuelle Zeile

SELECT EMPNO,SAL 
FROM EMP E 

einige Felder aus emp Wählen

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

Wo 1 bis max DEPTNO von DEPT gleich sein müssen von EMP das Feld ENAME enthält AME (beachten Sie, dass Dies ist die Groß- und Kleinschreibung.

Dies bedeutet, dass der Vergleich entweder 1 = null (das ist null, nicht falsch) oder - mit Beispieldaten - 1 = 3 (was falsch ist).

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

Oder EMPNO ist gleich dem Maximum von DEPTNO von DEPT mit einer gewundenen Abfrage, die keinen Sinn macht: Sie sind die maximale DEPTNO Abfrage, wo die ENAME der aktuellen Zeile von EMP E zu gleich jeder erste ENAME für wo der EMPNO ist gleich dem aktuellen DEPTNO von DEPT D (die Angabe der Beispieldaten ist immer falsch).

Diese Abfrage wird immer null ergeben, da - in der Abtastdaten - die Werte in EMPNO von DEPTNO disjunkt sind, so ist das Ergebnis der innersten Abfrage ist keine Zeile (Ausbeuten null), so dass die erste innere Abfrage ergibt auch null . Selbst wenn die erste innere Abfrage einen Wert zurückgegeben hätte, wäre die Auswertung immer noch falsch, da EMPNO und DEPTNO disjunkt sind.

Mit anderen Worten, die WHERE -Klausel entspricht WHERE FALSE OR NULL, die keine Zeilen ergibt.

Ich habe keine Ahnung, was Open Access ist (weil eine schnelle Suche nichts enthüllt, dass genannt), aber es scheint sehr seltsame Bewertungsregeln für SQL-Abfragen zu haben.

Da ich nicht verstehe, was diese Abfrage abzurufen versucht, kann ich Ihnen auch keine funktionierende Abfrage anbieten.

+0

Danke, kann ich Dokumentation Link für firebird3.0 bekommen. – kvk30

+0

@ kvk30 Beachten Sie, dass dies nicht wirklich Firebird-spezifisch ist, diese Antwort würde für jedes normale RDBMS gelten, die Dokumentation für Firebird 3 ist [Firebird 2.5 Language Reference] (http: //www.firebirdsq l.org/file/documentation/reference_manuals/fblangref25-de/html/fblangref25.html) und [Firebird 3.0 Release Notes] (http://www.firebirdsql.org/file/documentation/release_notes/html/en/3_0/ rlsnotes30.html) für die Änderungen seit 2.5. –

+0

Mark, Wenn Firebird SQL-Umgebung erstellen kann, dann sollte es eine Alternative haben, oder? – kvk30