表 DECLARATION を表示します。大陸番号として CONTINENT を使用しているようです。次に、PRIMARY KEY および NOT NULL オプションでマークされていることを確認する必要があります。SQL における NULL の非常に特別な意味を忘れてしまったのではないかと思います。
Firebird 2.5.1 SQL サーバーで例を作成します。
CREATE TABLE WORLD (
CONTINENT INTEGER,
NAME VARCHAR(20),
POPULATION INTEGER
);
INSERT INTO WORLD (CONTINENT, NAME, POPULATION) VALUES (NULL, 'null-id', 100);
INSERT INTO WORLD (CONTINENT, NAME, POPULATION) VALUES (1, 'normal 1', 10);
INSERT INTO WORLD (CONTINENT, NAME, POPULATION) VALUES (2, 'normal 2', 200);
INSERT INTO WORLD (CONTINENT, NAME, POPULATION) VALUES (3, 'null-pop', NULL);
INSERT INTO WORLD (CONTINENT, NAME, POPULATION) VALUES (4, 'normal 4', 110);
COMMIT WORK;
次に、リクエストを試して、CONTINENT IS NULL を持つ最初の行がどこにでも存在するかどうかを確認しましょう。
SELECT continent, population FROM world
WHERE continent IN (
SELECT continent FROM world
WHERE population > 100)
CONTINENT POPULATION
2 200
4 110
その後
SELECT continent, population FROM world
WHERE continent NOT IN (
SELECT continent FROM world
WHERE population > 100)
CONTINENT POPULATION
1 10
3 <NULL>
リクエストのロジックにより、CONTINENT が行 ID であると仮定した場合、NOT-NULL にする必要があり、[NOT] IN 条件では表示されない行はありません。
ここで、これをフラット クエリに言い換えてみましょう。
SELECT continent, population FROM world
WHERE NOT (population > 100)
CONTINENT POPULATION
<NULL> 100
1 10
SELECT continent, population FROM world
WHERE population > 100
CONTINENT POPULATION
2 200
4 110
今回は、欠落した行は人口列に NULL を持つ行でした。
その後、FreshPrinceOfSOは EXISTS 句の使用を提案しました。潜在的には最も遅い (効果のない) クエリ プランで終了する可能性がありますが、少なくとも SQL の NULL 値の特別な意味を隠します。
SELECT continent, population FROM world w_ext
WHERE EXISTS (
SELECT continent FROM world w_int
WHERE (w_int.population > 100) and (w_int.continent = w_ext.continent)
)
CONTINENT POPULATION
2 200
4 110
SELECT continent, population FROM world w_ext
WHERE NOT EXISTS (
SELECT continent FROM world w_int
WHERE (w_int.population > 100) and (w_int.continent = w_ext.continent)
)
CONTINENT POPULATION
<NULL> 100
1 10
3 <NULL>