IN и ANY не работают должным образом в H2 (с примерами)

РЕДАКТИРОВАТЬ: Это, похоже, ошибка в 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);

Рассмотрим следующие запросы:

А. Найти SALs всех пользователей, пропускающих первые два при сортировке по убыванию

SELECT 
    USERS.SAL AS user_sal 
FROM 
    USERS 
ORDER BY USERS.SAL DESC LIMIT 10 OFFSET 2

30000
25000
20000
18000
10000

Б. Я хочу найти AGE из тех пользователей, которые соответствуют запросу А. Итак, у меня есть следующий запрос:

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

0 ответов

Другие вопросы по тегам