Я сталкиваюсь с проблемой с результатами, казалось бы, базового c запроса (на SQL Server 2017 CU17), и я надеюсь, что люди могли бы предложить некоторые вещи, которые я, возможно, не проверял или пытался получить правильные результаты.
Суть проблемы заключается в том, что я пытаюсь идентифицировать строки в одной таблице, где идентификатор существует в другой. Обычно это можно сделать с помощью LEFT JOIN, в этом случае запрос выглядит так просто:
SELECT t1.id,
t2.id
FROM Table1 AS t1
LEFT JOIN Table2 t2 ON t2.id = t1.id
WHERE t2.id IS NULL
Этот запрос должен идентифицировать строки, которые существуют в Table1, но не существуют в Table2, на основе столбцы 'id', и они работают со стати c данными, которые никак не изменяются при выполнении запроса.
Я получаю странный результат отсюда возвращаются строки, где возвращается t1.id, но t2.id равен NULL - как будто есть строки, которые существуют в t1, но не в t2. Тем не менее, если я возьму один из идентификаторов, возвращенных из первого запроса, и вручную проверим, существует ли он в обеих таблицах, похоже, что идентификатор существует в обеих - даже если я вставлю этот идентификатор в запрос с внутренним объединением, такой как следует:
SELECT t1.id,
t2.id
FROM Table1 AS t1
INNER JOIN Table2 t2 ON t2.id = t1.id
WHERE t1.id = 761179370
Если я запускаю запрос LEFT JOIN несколько раз, я получаю разное количество строк, возвращаемых каждый раз. Важно отметить, что столбцы id имеют оба типа данных int, и таблицы имеют одинаковую сортировку.
Что я пробовал:
- Я перестроил статистику по всем столбцам и индексам для каждой таблицы, чтобы посмотреть, не вызывало ли это какие-то проблемы.
- Я восстановил база данных на другом сервере и работает так же, и не получить проблему, которую я вижу выше. База данных находится в группе доступности, и я также выполнил тот же запрос на читаемом вторичном сервере, и не вижу того же поведения.
- Сервер, на котором я выполнял запрос LEFT JOIN, включен, в целом занятый сервер - может ли это быть причиной того, что запрос не возвращает правильные результаты?
- Я пытался включить и выключить ANSI_NULLS, без разницы.
Любая идея, в чем проблема может быть, или что я мог проверить, чтобы выяснить, почему я получаю эти результаты - любые рекомендации будут оценены!