无法更新视图或函数 '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;
请注意,这会删除 所有 具有重复值的行。通常,您希望保留其中一个值。如果是这样,再问一个问题。
我想使用 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;
请注意,这会删除 所有 具有重复值的行。通常,您希望保留其中一个值。如果是这样,再问一个问题。