KB2433265 - 修正:在 SQL Server 2008 和 SQL Server 2008 R2 中,當您執行使用 ROW_NUMBER 函數搭配左方外部聯結的查詢時,可能會收到不正確的結果

套用到
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 會發佈 Microsoft SQL Server 2008 修正程式作為一個可下載的檔案。 由於修正程式是累積式,因此每個新版本都包含所有 Hotfix 和先前 SQL Server 2008 修正程式版本中包含的所有安全性修正程式。

症狀

請考量以下情況。

  • 您在 Microsoft SQL Server 2008 中有使用 ROW_NUMBER 函數和左外部聯結的查詢。
  • 您建立一個 SELECT 陳述式,該陳述式會使用查詢做為子查詢,並使用 DISTINCT 關鍵字傳回唯一資料列。
  • 您執行此 SELECT 陳述式。

在此案例中,您可能會收到不正確的結果。 左外部聯結被錯誤地忽略。

注意:如需如何重現此問題的詳細資訊,請參閱「更多資訊」一節中的「重現此問題的步驟」小節。

解決方式

累積更新資訊

SQL Server 2008 R2

此問題的修正程式最初在累積更新 6 中發行。 如需有關如何取得 SQL Server 2008 R2 的累積更新套件的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:

2489376 SQL Server 2008 R2 的累積更新套件 6 注意:由於組建是累積的,因此每個新發行的修正程式都包含所有 Hotfix 和所有安全性修正程式,這些都包含在先前的 SQL Server 2008 R2 修正程式版本中。 建議您考慮套用包含此 Hotfix 的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

981356 在 SQL Server 2008 R2 發行之後所發行的 SQL Server 2008 R2 組建 (機器翻譯)

SQL Server 2008 Service Pack 1

此問題的修正程式最初在 SQL Server 2008 Service Pack 1 的累積更新 11 中發行。

如需有關此累積更新套件的詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

2413738 SQL Server 2008 Service Pack 1 累積更新套件 11 注意:由於這些組建是累積的,因此每個新發行的修正程式都包含所有 Hotfix 和所有安全性修正程式,這些修正程式都包含在上一個 SQL Server 2008 修正程式版本中。 Microsoft 建議您考慮套用包含此 Hotfix 的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

970365 發行 SQL Server 2008 Service Pack 1 之後所發行的 SQL Server 2008 組建Microsoft SQL Server會為特定 SQL Server Service Pack 建立 Hotfix。 您必須將 SQL Server 2008 Service Pack 1 Hotfix 套用至 SQL Server 2008 Service Pack 1 的安裝。 預設情況下,SQL Server Service Pack 中提供的任何 Hotfix 都會包含在下一個 SQL Server Service Pack 中。

SQL Server 2008 Service Pack 2

此問題的修正程式最初在 SQL Server 2008 Service Pack 2 的累積更新 2 中發行。 如需有關此累積更新套件的詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

2467239 SQL Server 2008 Service Pack 2 累積更新套件 2 注意:由於這些組建是累積的,因此每個新發行的修正程式都包含所有 Hotfix 和所有安全性修正程式,這些修正程式都包含在上一個 SQL Server 2008 修正程式版本中。 Microsoft 建議您考慮套用包含此 Hotfix 的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

2402659 SQL Server 2008 Service Pack 2 發行之後所發行的 SQL Server 2008 組建Microsoft SQL Server會為特定 SQL Server Service Pack 建立 Hotfix。 您必須將 SQL Server 2008 Service Pack 2 Hotfix 套用至 SQL Server 2008 Service Pack 2 的安裝。 預設情況下,SQL Server Service Pack 中提供的任何 Hotfix 都會包含在下一個 SQL Server Service Pack 中。

狀態

Microsoft 已確認這是「適用對象」一節中列出的 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 累加式服務模型的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:

935897 來自 SQL Server 團隊之可傳遞解決回報問題的 Hotfix 的累加服務模型 (機器翻譯)

如需有關 SQL Server 更新命名架構的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:

822499 Microsoft SQL Server 軟體更新套件的新命名架構如需有關軟體更新術語的詳細資訊,請按一下下面的文章編號,檢視「Microsoft知識庫」中的文章:

824684 描述Microsoft軟體更新所使用的標準術語說明