不同服务器中相同查询的数据输出不同
Data output varying for same query in different server
我正在通过开放访问命令验证 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);
您没有得到任何信息的原因很简单,您拥有的数据不允许返回任何数据。让我们剖析您的查询:
SELECT EMPNO,SAL
FROM EMP E
Select 来自 emp
的一些字段
WHERE 1 = (SELECT MAX(DEPTNO)
FROM DEPT D
WHERE E.ENAME like '%AME%')
如果对于来自 EMP
的当前行,字段 ENAME
包含 AME
,则 1 必须等于来自 DEPT
的最大值 DEPTNO
(注意这是区分大小写的)。
这意味着比较要么是 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
等于 DEPT
的 DEPTNO
的最大值,带有一个毫无意义的复杂查询:您正在查询最大值 DEPTNO
其中 [ EMP E
当前行的 =16=] 等于 any 首先 ENAME
因为 EMPNO
等于当前行 DEPTNO
of DEPT D
(给定样本数据总是错误的)。
此查询将始终产生 null
,因为 - 在样本数据中 - EMPNO
中的值与 DEPTNO
分离,因此最内层查询的结果是没有行(产生 null),所以第一个内部查询也会产生 null
。即使第一个内部查询返回了一个值,评估仍然是错误的,因为 EMPNO
和 DEPTNO
是分离的。
换句话说,WHERE
子句等同于 WHERE FALSE OR NULL
,它不产生任何行。
我不知道开放访问是什么(因为快速搜索不会显示任何所谓的),但它似乎对 SQL 查询有非常奇怪的评估规则。
由于我不明白此查询要检索的内容,因此我也无法为您提供有效的查询。
我正在通过开放访问命令验证 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);
您没有得到任何信息的原因很简单,您拥有的数据不允许返回任何数据。让我们剖析您的查询:
SELECT EMPNO,SAL
FROM EMP E
Select 来自 emp
的一些字段WHERE 1 = (SELECT MAX(DEPTNO)
FROM DEPT D
WHERE E.ENAME like '%AME%')
如果对于来自 EMP
的当前行,字段 ENAME
包含 AME
,则 1 必须等于来自 DEPT
的最大值 DEPTNO
(注意这是区分大小写的)。
这意味着比较要么是 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
等于 DEPT
的 DEPTNO
的最大值,带有一个毫无意义的复杂查询:您正在查询最大值 DEPTNO
其中 [ EMP E
当前行的 =16=] 等于 any 首先 ENAME
因为 EMPNO
等于当前行 DEPTNO
of DEPT D
(给定样本数据总是错误的)。
此查询将始终产生 null
,因为 - 在样本数据中 - EMPNO
中的值与 DEPTNO
分离,因此最内层查询的结果是没有行(产生 null),所以第一个内部查询也会产生 null
。即使第一个内部查询返回了一个值,评估仍然是错误的,因为 EMPNO
和 DEPTNO
是分离的。
换句话说,WHERE
子句等同于 WHERE FALSE OR NULL
,它不产生任何行。
我不知道开放访问是什么(因为快速搜索不会显示任何所谓的),但它似乎对 SQL 查询有非常奇怪的评估规则。
由于我不明白此查询要检索的内容,因此我也无法为您提供有效的查询。