gpt4 book ai didi

sql - 删除不不同的行

转载 作者:行者123 更新时间:2023-12-02 14:58:57 25 4
gpt4 key购买 nike

我有一个具有唯一非聚集索引的表,并且该索引中列出了其中的 4 列。我想更新表中的大量行。如果我这样做,它们将不再不同,因此更新会因索引而失败。

我想禁用索引,然后删除最旧的重复行。这是我到目前为止的查询:

SELECT t.itemid, t.fieldid, t.version, updated
FROM dbo.VersionedFields w
inner JOIN
(
SELECT itemid, fieldid, version, COUNT(*) AS QTY
FROM dbo.VersionedFields
GROUP BY itemid, fieldid, version
HAVING COUNT(*) > 1
) t
on w.itemid = t.itemid and w.fieldid = t.fieldid and w.version = t.version

内连接中的选择返回我们想要删除的正确数量的记录,但对它们进行分组,因此实际上数量是两倍。

加入后显示所有记录,但我只想删除最旧的记录?

如何做到这一点?

最佳答案

如果您说的是SQL(结构化查询语言),但实际上是指SQL Server(Microsoft 关系数据库系统),并且您使用的是 SQL Server 2005 或更新版本中,您可以使用 CTE(公共(public)表表达式)来实现此目的。

使用此 CTE,您可以按某些条件(即 ItemId)(或列的组合)对数据进行分区,并让 SQL Server 对每个分区的所有行进行编号,从 1 开始,按其他一些标准排序 - 即可能 version (或其他一些列)。

所以尝试这样的事情:

;WITH PartitionedData AS
(
SELECT
itemid, fieldid, version,
ROW_NUMBER() OVER(PARTITION BY ItemId ORDER BY version DESC) AS 'RowNum'
FROM dbo.VersionedFields
)
DELETE FROM PartitionedData
WHERE RowNum > 1

基本上,您按照某些标准对数据进行分区,并对每个分区进行编号,每个新分区从 1 开始,按其他一些标准(例如日期或版本)排序。

因此,对于数据的每个“分区”,“最新”条目的 RowNum = 1,并且属于同一分区的任何其他条目(通过具有相同的分区值)将具有从 2 到 1 的连续编号值不管该分区中有多少行。

如果您只想保留最新条目 - 删除 RowNum 大于 1 的任何内容即可!

关于sql - 删除不不同的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6916039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com