2017-12-18 184 views
0

如何从视图中删除重复记录?我需要保持他们在物理表,但在看法,我不想重复从SQL Server视图中删除重复记录

这里是我使用的查询:

CREATE VIEW myview 
AS 
    SELECT DISTINCT * 
    FROM [roug].[dbo].[Table_1] 
    ORDER BY id 

为表:

id| name age 
---------- 
c1 ann 12 
u2 joe 15 
c1 ann 12 
c1 ann 12 
u5 dev 13 
u3 Jim 16 
u3 Jim 16 
+0

您是否试图从表中删除物理副本?或者您只需要在视图中查看没有重复的记录,但希望将记录保存在表中? –

+0

需要在视图中查看没有重复的记录。保持表中的记录保持不变@JayasuryaSatheesh –

回答

2

您可以使用DISTINCT或ROW_NUMBER()筛选

create view myview as 
WITH CTE 
AS 
(
    SELECT 
    RN = ROW_NUMBER() OVER(PARTITION BY [Id],[Name],[Age] ORDER BY ID), 
    * 
FROM [roug].[dbo].[Table_1] 
) 
SELECT 
    [Id],[Name],[Age] 
    FROM CTE 
     WHERE RN = 1 
+0

除非指定了TOP,OFFSET或FOR XML,否则ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中无效。 这是获取@Jayasurya Satheesh的错误消息 –

+0

@AnuAntony尝试不加订单by.I已更新答案 –

1

如果你想删除的数据,那么你应该b e在源表中执行它而不是视图。标准的去重方法是通过cte。尝试

; 
    WITH cte 
      AS (SELECT id 
       ,   name 
       ,   age 
       ,   ROW_NUMBER() OVER (PARTITION BY id, name, age ORDER BY id) RN 
       FROM  Table_1 
      ) 
    DELETE FROM cte 
    WHERE RN > 1 

取决于您是要删除实际数据,还是只是不显示它在视图中。

+0

问题是从视图中跳过重复项而不从表中删除它们 –

+0

没问题。表达一个问题有时可能很困难。我的答案和Jayasurya都使用相同的技术,尽管我很想知道DISTINCT为什么不适合你。是否有其他领域涉及您的真实世界使用?或隐藏的字符等?一个简单的区别应该是很好的选择。 –