Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 无法更新视图或函数“cte”,因为它包含聚合、DISTINCT或GROUP BY子句、PIVOT或UNPIVOT运算符_Sql_Sql Server_Sql Server 2012_Having - Fatal编程技术网

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

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 但我有以下例外: 无法更新视图

我想用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
但我有以下例外:

无法更新视图或函数“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、[从日期]、[截止日期]、[请求日期]、[请求年份]上的索引。