2012-08-13 72 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