KB2433265 - ИСПРАВЛЕНО: Вы можете получить неверный результат при выполнении запроса, в котором используется функция ROW_NUMBER вместе с левым внешним соединением в SQL Server 2008 и SQL Server 2008 R2

Применяется к
SQL Server 2008 Enterprise SQL Server 2008 Standard SQL Server 2008 Workgroup SQL Server 2008 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Standard SQL Server 2008 R2 Workgroup SQL Server 2008 R2 Developer

Корпорация Майкрософт распространяет исправления Microsoft SQL Server 2008 в виде одного загружаемого файла. Поскольку исправления являются накопительными, каждый новый выпуск содержит все исправления и исправления для системы безопасности, которые были включены в предыдущий выпуск исправления SQL Server 2008.

Проблема

Рассмотрим следующий сценарий.

  • У вас есть запрос, в котором используется функция ROW_NUMBER вместе с левым внешним соединением в Microsoft SQL Server 2008.
  • Вы создаете инструкцию SELECT, которая использует запрос как подчиненный запрос и возвращает уникальные строки с помощью ключевого слова DISTINCT.
  • Вы запускаете эту инструкцию SELECT.

В этом случае вы можете получить неправильный результат. Левое внешнее соединение неправильно игнорируется.

Примечание. Дополнительные сведения о том, как воспроизвести эту проблему, см. в подразделе "Действия по воспроизведению этой проблемы" в разделе "Дополнительные сведения".

Решение

Сведения о накопительном пакете обновления

SQL Server 2008 R2

Исправление для этой проблемы впервые выпущено в накопительном пакете обновления 6. Для получения дополнительной информации о том, как получить этот накопительный пакет обновления для SQL Server 2008 R2, откройте статью со следующим номером в базе знаний Майкрософт:

Накопительный пакет обновления 6 2489376 для SQL Server 2008 R2 Примечание Поскольку сборки являются накопительными, каждый новый выпуск исправления содержит все исправления и исправления для системы безопасности, которые были включены в предыдущий выпуск исправления SQL Server 2008 R2. Рекомендуется рассмотреть возможность применения последнего выпуска исправления, содержащего это исправление. Для просмотра статьи в базе знаний Майкрософт щелкните следующий номер статьи:

981356 Сборки SQL Server 2008 R2, выпущенные после выпуска SQL Server 2008 R2

SQL Server 2008 с пакетом обновления 1 (SP1)

Исправление для этой проблемы было впервые выпущено в накопительном пакете обновления 11 для SQL Server 2008 с пакетом обновления 1.

Дополнительные сведения об этом накопительном пакете обновления см. в следующей статье базы знаний Майкрософт:

2413738 Накопительный пакет обновления 11 для SQL Server 2008 с пакетом обновления 1Примечание Поскольку сборки являются накопительными, каждый новый выпуск исправления содержит все исправления и исправления для системы безопасности, которые были включены в предыдущий выпуск исправления SQL Server 2008 г. Корпорация Майкрософт рекомендует рассмотреть возможность применения последнего выпуска исправления, содержащего это исправление. Для просмотра статьи в базе знаний Майкрософт щелкните следующий номер статьи:

970365 Сборки SQL Server 2008 г., выпущенные после выпуска SQL Server 2008 с пакетом обновления 1 (SP1) Исправления для Microsoft SQL Server 2008 предназначены для определенных пакетов обновления SQL Server. Необходимо установить исправление для SQL Server 2008 с пакетом обновления 1 (SP1) для установки SQL Server 2008 с пакетом обновления 1. По умолчанию все исправления, предоставляемые в пакете обновления для SQL Server, входят в следующий пакет обновления для SQL Server.

SQL Server 2008 с пакетом обновления 2 (SP2)

Исправление для этой проблемы было впервые выпущено в накопительном пакете обновления 2 для SQL Server 2008 с пакетом обновления 2. Дополнительные сведения об этом накопительном пакете обновления см. в следующей статье базы знаний Майкрософт:

2467239 Накопительный пакет обновления 2 для SQL Server 2008 с пакетом обновления 2 (SP2) Так как сборки являются накопительными, каждый новый выпуск исправления содержит все исправления и исправления для системы безопасности, которые были включены в предыдущий выпуск исправления SQL Server 2008 г. Корпорация Майкрософт рекомендует рассмотреть возможность применения последнего выпуска исправления, содержащего это исправление. Для просмотра статьи в базе знаний Майкрософт щелкните следующий номер статьи:

2402659 Сборки SQL Server 2008 г., выпущенные после выпуска SQL Server 2008 с пакетом обновления 2 (SP2) Исправления для Microsoft SQL Server 2008 предназначены для определенных пакетов обновления для SQL Server. Необходимо применить исправление SQL Server 2008 с пакетом обновления 2 (SP2) для установки SQL Server 2008 с пакетом обновления 2. По умолчанию все исправления, предоставляемые в пакете обновления для SQL Server, входят в следующий пакет обновления для SQL Server.

Состояние

Корпорация Майкрософт подтвердила, что это проблема продуктов Microsoft, перечисленных в разделе «Относится к».

Дополнительные сведения

Действия по воспроизведению проблемы

  1. Выполните следующие инструкции. Эти инструкции создают две таблицы, в которые вставляются некоторые данные.

    create table A (a1 int)
    
    create table B (b1 int)
    
    
    
    insert into A values(1)
    
    insert into B values(1)
    
    insert into B values(1)
    
  2. Выполните следующую инструкцию. В этой инструкции функция ROW_NUMBER используется вместе с левым внешним соединением.

    select a1, row_number() over (partition by a1 order by a1) as a3
    
    from A
    
    left join B ON A.a1 = B.b1
    
  3. Выполните следующую инструкцию. В этой инструкции в качестве вложенного запроса используется запрос, выполненный на шаге 2.

    select distinct a1, a3
    
    from (
    
          select a1, row_number() over (partition by a1 order by a1) as a3
    
          from A
    
          left join B ON A.a1 = B.b1
    
    ) as x
    

Примечание: при возникновении этой проблемы запрос на шаге 3 возвращает неверный результат.

Ссылки

Дополнительные сведения о функции ROW_NUMBER и внешних соединениях см. на следующих веб-сайтах сети Microsoft Developer Network (MSDN):

Дополнительные сведения о модели добавочного обслуживания для SQL Server см. в следующей статье базы знаний Майкрософт:

935897 Команда SQL Server предоставляет модель добавочного обслуживания для предоставления исправлений для обнаруженных проблем

Дополнительные сведения о схеме именования для обновлений SQL Server см. в следующей статье базы знаний Майкрософт:

822499 Новая схема именования пакетов обновления программного обеспечения Microsoft SQL Server Дополнительные сведения о терминологии обновления программного обеспечения см. в следующей статье базы знаний Майкрософт:

824684 Стандартные термины, используемые при описании обновлений программного обеспечения Майкрософт