1

编辑:这似乎是 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) 的正确结果。

4

0 回答 0