2016-07-28 518 views
0

我想要使用Having by來刪除。無法更新視圖或函數'cte',因爲它包含集合,或者DISTINCT或GROUP BY子句,或者PIVOT或UNPIVOT運算符

所以我儘量執行以下語句:

;WITH cte As 
(
select emp_num, [from_date],[to_date],[ req_ser], [ req_year] 
from empmission 
group by emp_num, [from_date],[to_date],[ req_ser], [ req_year] 
having count(*) >2 
) 

DELETE 
FROM cte 

,但我得到以下異常:

無法更新視圖或函數「CTE」,因爲它包含 聚集,或DISTINCT或GROUP BY子句,或者PIVOT或UNPIVOT運算符。

+0

我想刪除'有數量(*)> 2'的地方 –

+0

從授權中刪除不是所有鍵值匹配的地方。 – xQbert

+0

@xQbert:你可以寫查詢 –

回答

1

使用窗口功能:

WITH todelete As (
     select em.*, 
      row_number() over (partition by emp_num, [from_date],[to_date],[ req_ser], [ req_year] 
           order by (select null)) as cnt 
     from empmission em 
) 

DELETE FROM todelete 
WHERE cnt > 2; 

注意,這將刪除所有有重複的值。通常情況下,你想保留其中的一個值。如果是這樣,請提出另一個問題。

+0

'函數'row_number'必須有一個ORDER BY' –

+0

:謝謝,但它很慢我不能運行它 –

+0

@AnynameDonotcare。 。 。 'row_number()'利用了'emp_num,[from_date],[to_date],[req_ser],[req_year])'上的索引。 –

2

內部連接回到原始表並刪除它。

;WITH cte As 
(
select emp_num, [from_date],[to_date],[ req_ser], [ req_year] 
from  empmission 
group by emp_num, [from_date],[to_date],[ req_ser], [ req_year] 
having count(*) >2 
)  
DELETE E 
FROM cte C 
JOIN empmission E ON C.emp_num = E.emp_num 
         AND C.from_date = E.from_date 
         AND C.to_date = E.to_date 
         AND C.req_ser = E.req_ser 
         AND C.req_year = E.req_year 
+0

我認爲你可能需要關閉select中的所有列而不僅僅是emp_num,但我不確定沒有表結構。 – xQbert

+0

是的,我做到了。輸入太快:) – Squirrel

+0

謝謝,但它很慢,我不能運行它 –

1

的另一種方式,跳過CTE,做EXISTS代替:

delete from empmission e1 
where exists (select 1 
       from empmission e2 
       where e1.emp_num = e1.emp_num 
       and e1.[from_date] = e2.[from_date] 
       and e1.[to_date] = e2.[to_date] 
       and e1.[ req_ser] = e2.[ req_ser] 
       and e1.[ req_year] = e2.[ req_year] 
       group by emp_num, [from_date],[to_date],[ req_ser], [ req_year] 
       having count(*) > 2) 
+0

''e1'附近的錯誤語法。' –

+0

核心ANSI SQL,但顯然無效MS SQL Server代碼... – jarlh

相關問題