2012-08-13 55 views
0

我試圖去查詢的底部,如果我在內部選擇以下語句僅過濾返回的數據,其中有:SQL數據纔會返回

作品:

SELECT * FROM 
(
SELECT  
     [szPhoneNo] Email  
     ,ROW_NUMBER() OVER (PARTITION BY CLID ORDER BY t_clientphone.PhoneType_Id ASC) AS Seq  
    FROM [SLacsis_SLM].[dbo].[T_ClientPhone] t_clientphone INNER JOIN 
    [SLacsis_SLM].[dbo].[TL_PhoneType] PT ON t_clientphone.PhoneType_ID = PT.PhoneType_ID 
    WHERE t_clientphone.szPhoneNo LIKE '%reg28%'   
      ) T where T.Seq = 1 --AND Email LIKE '%reg28%' 

(10行返回)

不起作用:

SELECT * FROM 
(
SELECT  
     [szPhoneNo] Email  
     ,ROW_NUMBER() OVER (PARTITION BY CLID ORDER BY t_clientphone.PhoneType_Id ASC) AS Seq  
    FROM [SLacsis_SLM].[dbo].[T_ClientPhone] t_clientphone INNER JOIN 
    [SLacsis_SLM].[dbo].[TL_PhoneType] PT ON t_clientphone.PhoneType_ID = PT.PhoneType_ID 
    --WHERE t_clientphone.szPhoneNo LIKE '%reg28%'    
      ) T where T.Seq = 1 AND Email LIKE '%reg28%' 

(0行返回)

任何人都可以解釋爲什麼沒有行返回第二個查詢,如果有一種方法,我可以解決它?

我知道ROW_NUMBER非determistic當PARTITION BYORDER BY列不是唯一的(這是在內部選擇少數行的情況下)。

我會看看是否可以在臨時表中使用臨時表重新創建問題。

+0

這是因爲在所有記錄已知之後,窗口函數被應用於記錄。在第一種情況下,您正在檢索過濾的記錄並僅獲取匹配,檢索的行少於一秒。在第二種情況下,Seq = 1檢索不同的記錄。 – 2012-08-13 11:10:08

+0

謝謝尼古拉現在對我有意義。 – woggles 2012-08-13 11:21:59

回答

1

第二個查詢中的第一項(即:那些Seq = 1)沒有像%REG28%這樣的電子郵件。

+0

我不確定我遵循:Seq = 1和電子郵件如'%reg28%'的記錄。我將在一秒內發佈嵌套選擇結果的示例。 – woggles 2012-08-13 11:13:06

+0

@woggles你確定嗎?如果你在第二個查詢中找到'AND'電子郵件,例如'%reg28%',你會得到什麼? – podiluska 2012-08-13 11:15:09

+1

在這種情況下,我得到了完整的結果集......但我看到了尼古拉現在所說的話。 row_number()在內部select中沒有where子句時顯然會不同 - 導致不同的記錄被排名爲1.所以你是對的! – woggles 2012-08-13 11:20:20