2016-07-28 17 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

相关问题