从没有主键的临时表中删除重复字段 [重复]

Posted

技术标签:

【中文标题】从没有主键的临时表中删除重复字段 [重复]【英文标题】:Remove duplicate fields from a temp table that has no primary key [duplicate] 【发布时间】:2013-04-01 01:11:39 【问题描述】:

我需要从临时表中删除重复字段,其中相关字段不完全相同。

例如,我有以下数据:

First  Last     DOB
John   Johnson  10.01.02
Steve  Stephens 23.03.02
John   Johnson  2.02.99
Dave   Davies   3.03.03

这里有两个 John Johnson 的。我只想要一个约翰约翰逊——我不在乎哪一个。所以结果表看起来像:

First  Last     DOB
John   Johnson  10.01.02
Steve  Stephens 23.03.02
Dave   Davies   3.03.03

我正在使用 TSQL,但我更喜欢使用非专有的 SQL。

谢谢

【问题讨论】:

【参考方案1】:

Sql Server 支持Common Table ExpressionWindow Functions。使用 ROW_NUMBER() 为每个组提供排名编号,您可以过滤掉排名大于 1 的记录(这是重复的一个

WITH records
AS
(
    SELECT  [First], [Last], DOB,
            ROW_NUMBER() OVER (PARTITION BY [First], [Last] ORDER BY DOB) rn
    FROM    TableName
)
DELETE FROM records WHERE rn > 1
SQLFiddle Demo TSQL Ranking Functions

【讨论】:

【参考方案2】:

您可以将CTEROW_NUMBER 一起使用:

WITH CTE AS
(
   SELECT RN = ROW_NUMBER() OVER (PARTITION BY First, Last ORDER BY First,  Last)
   FROM TempTable
)
DELETE CTE 
WHERE RN > 1;

DEMO

【讨论】:

【参考方案3】:

好吧,我迟到了,但这里有一个与数据库无关的解决方案:

SELECT A.*
FROM YourTable A
INNER JOIN (SELECT [First], [Last], MAX(DOB) MaxDob
            FROM YourTable
            GROUP BY [First], [Last]) B
    ON A.[First] = B.[First] 
    AND A.[Last] = B.[Last]
    AND A.DOB = B.MaxDob

And here is a sqlfiddle 有一个演示。 (感谢@JW 提供小提琴的架构)

【讨论】:

【参考方案4】:

您可以使用CTEROW_NUMBER() 来完成此操作:

WITH CTE
AS
(
    SELECT 
       First, 
       Last, 
       DOB,
       ROW_NUMBER() OVER (PARTITION BY First, Last ORDER BY DOB) RN
    FROM  
       Table1
)

DELETE FROM CTE WHERE RN > 1

SQL FIDDLE DEMO

【讨论】:

以上是关于从没有主键的临时表中删除重复字段 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server中的游标最好只能用于有主键或唯一键的表

查询删除临时表中的重复行

很菜的数据库问题,主键的值允许重复吗?外键啥作用?

如何删除没有临时表的 MySQL 表中的所有重复记录

SQL知识点整理(未完待续)

整行不匹配时的oracle合并语句[重复]