Oracle Жаба SQL запросов, приводящих к несовместимому количеству идентификаторов - PullRequest
0 голосов
/ 18 февраля 2020

Я использую Oracle Жаба с SQL командами в окне редактора.

Я создал две новые таблицы (PIDS1 и PIDS2), которые содержат только один столбец идентификационных номеров из две связанные таблицы.

Я ожидал, что PIDS2 будет содержать расширенный набор идентификаторов в PIDS1. Когда я попытался идентифицировать идентификаторы в PIDS2, которых нет в PIDS1, я начал дикую погоню goose.

Предположим, что с данными в моих таблицах происходит нечто неожиданное. Но я не могу понять смысл двух упрощенных запросов, описанных ниже. Числа противоречивы. Может кто-нибудь объяснить, что происходит?

-- PIDS1 IS A SINGLE-COLUMN TABLE THAT CONTAINS 1638061 DISTINCT ID'S
-- PIDS2 IS A SINGLE-COLUMN TABLE THAT CONTAINS 3510272 DISTINCT ID'S

SELECT COUNT(T2.ID)
    FROM PIDS2 T2
    WHERE T2.ID NOT IN (
        SELECT T1.ID
        FROM PIDS1 T1);

-- RESULT IS ZERO!
-- WTF? PIDS2 HAS MORE ID'S THAN PIDS1!

SELECT COUNT(T1.ID)
    FROM PIDS1 T1
    WHERE T1.ID NOT IN (
        SELECT T2.ID
        FROM PIDS2 T2);

-- RESULT IS 786690
-- WHERE DID THAT NUMBER COME FROM? LOOKS ARBITRARY

1 Ответ

1 голос
/ 18 февраля 2020

Никогда использовать NOT IN с подзапросом. Если любое значений, возвращаемых подзапросом, равно NULL, то все строки отфильтровываются.

По этой причине я всегда советую NOT EXISTS:

SELECT T2.ID
FROM PIDS2 T2
WHERE NOT EXISTS (SELECT 1 FROM PIDS1 T1 WHERE t1.ID = T2.ID);

Конечно, вы также можете добавить WHERE t1.ID IS NOT NULL к версии NOT IN. По моему опыту, вы забудете об этом в какое-то неподходящее время в будущем. Просто используйте NOT EXISTS.

...