2017-12-18 149 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爲什麼不適合你。是否有其他領域涉及您的真實世界使用?或隱藏的字符等?一個簡單的區別應該是很好的選擇。 –