T SQL - LEFT JOIN странные результаты - PullRequest
3 голосов
/ 16 апреля 2020

Я сталкиваюсь с проблемой с результатами, казалось бы, базового 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 данными, которые никак не изменяются при выполнении запроса.

LEFT JOIN query results image

Я получаю странный результат отсюда возвращаются строки, где возвращается 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

INNER JOIN query results for a given ID image

Если я запускаю запрос LEFT JOIN несколько раз, я получаю разное количество строк, возвращаемых каждый раз. Важно отметить, что столбцы id имеют оба типа данных int, и таблицы имеют одинаковую сортировку.

Что я пробовал:

  • Я перестроил статистику по всем столбцам и индексам для каждой таблицы, чтобы посмотреть, не вызывало ли это какие-то проблемы.
  • Я восстановил база данных на другом сервере и работает так же, и не получить проблему, которую я вижу выше. База данных находится в группе доступности, и я также выполнил тот же запрос на читаемом вторичном сервере, и не вижу того же поведения.
  • Сервер, на котором я выполнял запрос LEFT JOIN, включен, в целом занятый сервер - может ли это быть причиной того, что запрос не возвращает правильные результаты?
  • Я пытался включить и выключить ANSI_NULLS, без разницы.

Любая идея, в чем проблема может быть, или что я мог проверить, чтобы выяснить, почему я получаю эти результаты - любые рекомендации будут оценены!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...