编辑:这似乎是 H2 版本 1.4.190 中的错误。我在下面更新了我的帖子。该问题在版本 1.3.176 或 1.4.191 中不会发生。
(也欢迎提出优化查询的建议)
考虑下表的数据:
CREATE TABLE USERS (NAME VARCHAR(255), AGE INT, SAL INT);
INSERT INTO USERS VALUES('alice', 20, 25000);
INSERT INTO USERS VALUES('bob', 25, 20000);
INSERT INTO USERS VALUES('carol', 30, 30000);
INSERT INTO USERS VALUES('jim', 19, 10000);
INSERT INTO USERS VALUES('max', 59, 50000);
INSERT INTO USERS VALUES('alice', 28, 18000);
INSERT INTO USERS VALUES('bob', 43, 48000);
考虑以下查询:
A. 查找SAL
所有用户在降序排序时跳过前两个的 s
SELECT
USERS.SAL AS user_sal
FROM
USERS
ORDER BY USERS.SAL DESC LIMIT 10 OFFSET 2
30000
25000
20000
18000
10000
B. 我想找到AGE
与查询 A 匹配的那些用户。所以我有以下查询:
SELECT
USERS.AGE AS user_age
FROM
(SELECT
USERS.SAL AS user_sal
FROM
USERS
ORDER BY SAL DESC LIMIT 10 OFFSET 2) AS T,
USERS
WHERE
USERS.SAL = user_sal
20
25
30
19
28
这似乎给了我正确的数据。
C.我想重写(B),IN
所以我尝试了:
SELECT
USERS.AGE AS user_age
FROM
USERS
WHERE
USERS.SAL IN (SELECT
USERS.SAL AS user_sal
FROM
USERS
ORDER BY SAL DESC LIMIT 10 OFFSET 2)
它不返回任何东西,而我希望它返回与 (B) 相同的数据。
D. 我尝试将 (B) 重写为:
SELECT
USERS.AGE AS user_age
FROM
USERS
WHERE
USERS.SAL = ANY (SELECT
USERS.SAL AS user_sal
FROM
USERS
ORDER BY SAL DESC LIMIT 10 OFFSET 2)
它也不返回任何东西,而我希望它返回与 (B) 相同的数据。
E. 最后,我想找到 (A) 的补集,所以我使用:
SELECT
USERS.AGE AS user_age
FROM
USERS
WHERE
USERS.SAL <> ALL (SELECT
USERS.SAL AS user_sal
FROM
USERS
ORDER BY SAL DESC LIMIT 10 OFFSET 2)
59
43
(E) 给了我正确的数据。那么为什么不(C)和(D)呢?
H2 版本 1.4.190
编辑:似乎是 H2 中的错误。版本 1.3.176 给出了 (C) 和 (D) 的正确结果。