Sql 如何在不使用窗口函数的情况下,从表中删除所有列的值都相同的重复行?

Sql 如何在不使用窗口函数的情况下,从表中删除所有列的值都相同的重复行?,sql,sql-server,duplicates,Sql,Sql Server,Duplicates,我的桌子是空的 +-----+----+----+------+ |EmpID|Name|Dept|Deptno| +-----+----+----+------+ |1 |Abc |xyz |10 | |1 |Abc |xyz |10 | |2 |Def |pqr |20 | +-----+----+----+------+ 我希望输出表如下所示 +-----+----+----+------+ |EmpID|Name|Dept|Deptno| +----

我的桌子是空的

+-----+----+----+------+
|EmpID|Name|Dept|Deptno|
+-----+----+----+------+
|1    |Abc |xyz |10    |
|1    |Abc |xyz |10    |
|2    |Def |pqr |20    |
+-----+----+----+------+
我希望输出表如下所示

+-----+----+----+------+
|EmpID|Name|Dept|Deptno|
+-----+----+----+------+
|1    |Abc |xyz |10    |
|2    |Def |pqr |20    |
+-----+----+----+------+
条件:

不要使用窗口函数。 表没有任何键。 不要使用临时表。 我尝试了一个查询:

delete from table_name where EmpId IN (
select EmpID from table_name group by EmpId,Name,Email,Deptno having count(*)>1 )
但是,此查询将删除计数大于1的所有行。 但是,我试图删除除一行之外的重复行

仅使用CTE+行号删除重复行

;WITH cte
     AS (SELECT Row_number()OVER(partition BY EmpId, Name, Email, Deptno ORDER BY (SELECT NULL)) AS rn,*
         FROM   table_name)
DELETE FROM cte
WHERE  rn > 1 

我认为您可以通过应用下面的3个查询来在分区中只保留EmpId

一,。 ALTER TABLE dbo.test ADD AUTOID INT IDENTITY1,1

二,。 从dbo.test中选择*其中AUTOID不在SELECT MINAUTOID中_ 按EmpId、Name、dept、Deptno从dbo.test组

三,。 从dbo.test中删除,其中AUTOID不在SELECT MINAUTOID中_
按EmpId、Name、dept、Deptno从dbo.testgroup开始,只是为了确保。您必须从表中删除该重复行,还是希望输出没有重复行?为什么会出现这些情况?@DenStudent Yea。。我想删除同一个表中的重复项。@jarlh如果没有这些条件,问题很容易解决。真正的问题在于环境。我想找到其他解决问题的方法,接受所有条件。非常类似于老师的要求。我以前知道你的答案。。。但是,我正在试图找到没有窗口函数的其他方法…@KurellaHemanth-您是否有其他具有不同值的列这与使用行数相同。。。还有别的办法吗??
WITH CTE AS 
(
   SELECT EmpID,Name,Dept,Deptno,
       RN = ROW_NUMBER()OVER(PARTITION BY EmpID,Name,Dept,Deptno ORDER BY EmpID,Name,Dept,Deptno)
   FROM MyTable     
)
DELETE FROM CTE WHERE RN > 1