无法更新视图或函数 'cte',因为它包含聚合、DISTINCT 或 GROUP BY 子句、PIVOT 或 UNPIVOT 运算符

Cannot update the view or function 'cte' because it contains aggregates, or a DISTINCT or GROUP BY clause, or PIVOT or UNPIVOT operator

我想使用 Having by .

删除

所以我尝试执行以下语句:

;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

但我得到以下异常:

Cannot update the view or function 'cte' because it contains aggregates, or a DISTINCT or GROUP BY clause, or PIVOT or UNPIVOT operator.

inner join 回原来的 table 并删除它。

;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

另一种方法,跳过 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)

使用window函数:

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;

请注意,这会删除 所有 具有重复值的行。通常,您希望保留其中一个值。如果是这样,再问一个问题。