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