Sqlserver 处理两条完全一样的记录

想要删除重复记录(所有字段值相同),怎么处理?

 

with cte AS (
 select row_number() over (partition by wo_woid, wo_lx order by(select null)) as rn,*
    from jserp.Wo_Modified_Record_Backup
    where wo_woid like 'MO24%' and wo_woid>='MO240601'
and len(wo_woid)=14
and wo_woid='MO240612039480'
)
--update cte 
--set wo_sjkgrq = dateadd(day,-2,getdate())
-- where rn = 1;
delete from cte where rn > 1;

row_number() 这是一个窗口函数,用于为每一行生成一个唯一的序号。这个序号是基于特定的分组和排序条件生成的。

over (partition by Column1, Column2 order by (select null))
partition by:
含义:将结果集划分为多个部分(或分区),每个分区内的记录会被单独计算 row_number()。在这个例子中,Column1Column2 是用来定义相同记录的列。
例如,如果有多条记录的 Column1Column2 值完全相同,这些记录将被视为一个分区。

order by(select null):
含义:在没有指定具体的排序列时,使用 (select null) 表示不考虑排序。这意味着在每个分区内,生成的序号是随机的,因为没有明确的排序规则。
通常情况下,你需要根据某个列进行排序,以确保序号的一致性,但在这里我们只关心分区内的行号,所以可以用 (select null)

总结
整段查询的作用是:

Wo_Modified_Record_Backup 中选择所有列,并为每一组在  wo_woidwo_lx 上相同的记录生成一个行号 (rn)rn 的值在每个分区(相同的 wo_woid 和 wo_lx 组合)内从 1 开始递增。

 

WITH CTE AS 是 SQL 中的一种语法,用于创建一个公共表表达式(Common Table Expression,CTE)。CTE 可以被视为一个临时的结果集,它可以在查询中像表一样被引用,但它并不是一个实际的表。

在使用 WITH CTE AS 语法创建 CTE 时,你可以在 AS 子句中编写一个查询,该查询将返回一个结果集。这个结果集可以在后续的查询中被引用,就像一个表一样。因此,你可以在 CTE 中使用 SELECT 语句来定义一个结果集,然后在后续的查询中使用这个结果集。

在使用 CTE 时,你可以在 SELECTINSERTUPDATE 或 DELETE 语句中引用它。例如,你可以使用 UPDATE 语句来更新 CTE 中的数据,就像更新一个表一样。这是因为 CTE 返回的结果集可以被视为一个虚拟的表,它可以被更新、删除或插入数据。

需要注意的是,CTE 中的数据只存在于查询的生命周期中,当查询结束时,CTE 中的数据也会被销毁。因此,如果你需要在多个查询中使用相同的 CTE,你需要在每个查询中都重新定义它。

总之,WITH CTE AS 语法是 SQL 中的一种强大的工具,它可以让你在查询中创建一个虚拟的表,从而简化复杂的查询操作。同时,它也可以让你在查询中使用类似于表的语法来更新、删除或插入数据。

with cte AS (
select row_number() over (partition by wo_woid, wo_lx order by(select null)) as rn,*
from jserp.Wo_Modified_Record_Backup
where wo_woid like 'MO24%' and wo_woid>='MO240601'
and len(wo_woid)=14
and wo_woid='MO240612039480'
)

delete from cte where rn > 1;
--虽然cte是一个虚拟表,但是在删除的时候,最终对jserp.Wo_Modified_Record_Backup表造成了影响

在SQL Server中,CTE(Common Table Expression)是一种临时命名查询结果集的方法。它允许你在查询中创建一个临时的命名结果集,然后可以在后续的查询中引用它。

with cte AS (...) 创建了一个名为 cte 的CTE,它包含了从 jserp.Wo_Modified_Record_Backup 表中选择的数据,并使用 ROW_NUMBER() 函数为每行分配一个行号。这个行号是根据 wo_woid 和 wo_lx 进行分区,并按照 (SELECT NULL) 的方式进行排序(不排序)。

使用 DELETE FROM cte WHERE rn > 1; 语句从 cte 中删除行号大于1的记录。由于 cte 是基于 jserp.Wo_Modified_Record_Backup 表的查询结果创建的,因此对 cte 的删除操作也会影响到实际的表 jserp.Wo_Modified_Record_Backup

这种行为是因为在执行 DELETE 语句时,它会基于 cte 中的行号信息来删除相应的记录。因此,实际的表会受到影响。

需要注意的是,CTE 是一个临时的结果集,它的生命周期仅限于当前查询。一旦查询结束,CTE 中的数据就会被丢弃,不会对实际的表产生永久性的影响。

 

posted @ 2024-07-27 11:37  pandora2050  阅读(1)  评论(0编辑  收藏  举报