Sql 无法更新视图或函数“cte”,因为它包含聚合、DISTINCT或GROUP BY子句、PIVOT或UNPIVOT运算符
我想用Having by删除 因此,我尝试执行以下语句:Sql 无法更新视图或函数“cte”,因为它包含聚合、DISTINCT或GROUP BY子句、PIVOT或UNPIVOT运算符,sql,sql-server,sql-server-2012,having,Sql,Sql Server,Sql Server 2012,Having,我想用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 但我有以下例外: 无法更新视图
;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
接线员
内部联接返回到原始表并将其删除
;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
内部联接返回到原始表并将其删除
;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,而是:
另一种方法是跳过cte,而是: 使用窗口功能:
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;
请注意,这将删除具有重复值的所有行。通常,您希望保留其中一个值。如果是这种情况,请提出另一个问题。使用窗口功能:
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;
请注意,这将删除具有重复值的所有行。通常,您希望保留其中一个值。如果是这样的话,,问另一个问题。我想从所有键值匹配的Emmission中删除count*>2Delete而不是cte。@xQbert:你能写这个查询吗?我想从所有键值匹配的Emmission中删除count*>2Delete而不是cte。@xQbert:你能写这个查询吗?我想你可能需要关闭它选择列表中的所有列不仅仅是emp_num,而且我不确定没有表结构。表有多大?表中的索引是什么?没有索引,我想删除重复项以添加索引您仍然可以先为查询添加必要的索引。我认为您可能需要关闭select中所有列的键,不仅是emp_num,而且我不确定没有表结构。表有多大?表中的索引是什么?没有索引,我想删除重复项以添加索引您仍然可以首先为查询添加必要的索引函数“row_number”必须有一个带有ORDER BY的OVER子句:谢谢,但它太慢了,我无法运行it@AnynameDonotcare . . . 行号可以利用empmissionemp\u num、[from\u date]、[to\u date]、[req\u ser]、[req\u year]上的索引。函数“row\u number”必须有一个带有ORDER BY的OVER子句:谢谢,但它太慢了,我无法运行it@AnynameDonotcare . . . 行号可以利用empmissionemp_num、[从日期]、[截止日期]、[请求日期]、[请求年份]上的索引。