2014-11-14 78 views
0

我有一张表,我试图使用公共表表达式来查找重复行。是我工作的字段如下:CTE没有返回预期值

LOGTIME(数据类型:DATETIME2(7),NULL) ControllerIP(数据类型:nvchar(最大值),NULL)

我有两行数据是有据我所知,它们中的数据相同。我对两列进行了LEN检查,以确保它们的长度相同,但在下面使用CTE时,行不会重复为 。 LogTime列有什么不同吗?我从来没有碰到过这个。

WITH CTE AS 
(
SELECT rn = ROW_NUMBER() 
      OVER( 
       PARTITION BY LogTime , ControllerIP 
       ORDER BY Id ASC), * 
FROM [DownTime].[dbo].[Records] 
) 
SELECT * FROM cte 
WHERE FileName = '141101.CSV' AND rn > 1 
Order By ID 
GO 

此外,我正在使用Microsoft SQL Server 2008R2。

+0

'LEN'不计尾随空格(和其他非打印字符),所以2个值具有相同LEN和看起来一样,并不意味着它们具有相同的数据 – Lamak 2014-11-14 14:41:04

+1

从逻辑上讲,你的找到重复的策略是合理的。 LogTime或ControllerIP必须不同。 – 2014-11-14 14:41:32

+0

好的。我认为它的确如此。我会谷歌如何做到这一点,沿着这条道路走下去。 – 2014-11-14 14:42:18

回答

1

你的计划是健全的。如果你没有发现重复,那是因为重复不存在。您可以将某些函数应用于列以更有可能查找重复项,例如修剪IP空间并降低datetime2的精度。

WITH CTE AS (
    SELECT rn = ROW_NUMBER() OVER( 
     PARTITION BY CAST(LogTime AS datetime2(2)), RTRIM(LTRIM(ControllerIP)) 
     ORDER BY Id ASC), * 
    FROM [DownTime].[dbo].[Records] 
) 
SELECT * FROM cte 
WHERE FileName = '141101.CSV' AND rn > 1 
Order By ID 
+0

我最终得到这个工作的方式是通过一个c#控制台应用程序运行我的对象。我为每个对象使用了string.trim()方法并将其保存回数据库。这清理了数据,我开始在预期的地方看到重复的内容。 – 2014-11-19 12:13:37