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降順で並べ替えたときに最初の 2 つをスキップしてすべてのユーザーの を検索する

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

30000
25000
20000
18000
10000

AGEB.クエリ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