編集:これは 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
降順で並べ替えたときに最初の 2 つをスキップしてすべてのユーザーの を検索する
SELECT
USERS.SAL AS user_sal
FROM
USERS
ORDER BY USERS.SAL DESC LIMIT 10 OFFSET 2
30000
25000
20000
18000
10000
AGE
B.クエリ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) の正しい結果が得られます。