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);
Рассмотрим следующие запросы:
А. Найти SAL
s всех пользователей, пропускающих первые два при сортировке по убыванию
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).