2013-11-22 18 views
1

當我執行以下查詢:結束(分區)列未被識別。無效的列

SELECT 
    MH.MemberKey, 
    ROW_NUMBER() OVER(PARTITION BY MH.MemberKey ORDER BY MH.MemberKey ASC) AS "NewRow", 
    MH.FirstName, 
    MH.LastName, 
    MH.BirthDate, 
    MH.AddressLine1, 
    MH.AddressLine2, 
    MH.AddressLine3, 
    MH.City AS MemberCity, 
    MH.StateCode AS MemberState, 
    MH.ZipCode AS MemberZip 
FROM MembershipHistory MH 
WHERE NewRow = 1; 

我得到以下錯誤:

Msg 207, Level 16, State 1, Line 36 Invalid column name 'NewRow'.

我試圖保持AS,消除AS,除去"" ....似乎沒有任何工作。它只是不認識列。

回答

9

row_number功能在選擇評估工作完成後,WHERE子句已被應用,因此別名無法識別,則可以使用子查詢得到的結果:

select 
    MH.MemberKey, 
    NewRow, 
    MH.FirstName, 
    MH.LastName, 
    MH.BirthDate, 
    MH.AddressLine1, 
    MH.AddressLine2, 
    MH.AddressLine3, 
    MH.City AS MemberCity, 
    MH.StateCode AS MemberState, 
    MH.ZipCode AS MemberZip 
from 
(
    SELECT 
     MH.MemberKey, 
     ROW_NUMBER() OVER(PARTITION BY MH.MemberKey ORDER BY MH.MemberKey ASC) AS NewRow, 
     MH.FirstName, 
     MH.LastName, 
     MH.BirthDate, 
     MH.AddressLine1, 
     MH.AddressLine2, 
     MH.AddressLine3, 
     MH.City AS MemberCity, 
     MH.StateCode AS MemberState, 
     MH.ZipCode AS MemberZip 
    FROM MembershipHistory MH 
) MH 
WHERE NewRow = 1; 

在SQL Server中SELECT語句的邏輯順序Processinf是(從MSDN Docs):

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. WITH CUBE or WITH ROLLUP
  7. HAVING
  8. SELECT
  9. DISTINCT
  10. ORDER BY
  11. TOP
+0

謝謝。這似乎工作。儘管我通常沒有看到over子句的這種實現。奇怪。 –

+0

@Sparsh好奇的是,你看到過的子句有哪些實現? –

+0

@AaronBertrand通常,當您執行row_number over(partition by ....)時,別名將直接用於where子句以過濾數據。我不記得曾經使用子查詢來使用別名。 –

5

另一種方法是使用一個CTE:

;WITH x AS (SELECT MH.whatever, ROW_NUMBER() ... AS NewRow FROM dbo.table) 
SELECT * FROM x WHERE NewRow = 1;