Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何清除存档记录表中的重复条目_C#_Mysql_Asp.net_Sql Server_Tsql - Fatal编程技术网

C# 如何清除存档记录表中的重复条目

C# 如何清除存档记录表中的重复条目,c#,mysql,asp.net,sql-server,tsql,C#,Mysql,Asp.net,Sql Server,Tsql,一些背景信息:我正在为一家公司更新一个应用程序,我们有一个gridview,其中包含多个列,从标签到文本字段再到下拉列表。gridview中的每一行都代表一个不同的“条目”,它位于我的“条目”表中。当用户更改其中一列(更新下拉列表中选择的值、更改文本字段中的文本等)时,他们单击“更新按钮”,然后将所做的更改插入到“EntryLog”表中。这就是我们归档对特定条目所做的所有更改的方式。问题是,更新过程的旧实现将为该页面的gridview中的所有条目创建存档记录,即使用户实际上只更新了一个条目。这意

一些背景信息:我正在为一家公司更新一个应用程序,我们有一个gridview,其中包含多个列,从标签到文本字段再到下拉列表。gridview中的每一行都代表一个不同的“条目”,它位于我的“条目”表中。当用户更改其中一列(更新下拉列表中选择的值、更改文本字段中的文本等)时,他们单击“更新按钮”,然后将所做的更改插入到“EntryLog”表中。这就是我们归档对特定条目所做的所有更改的方式。问题是,更新过程的旧实现将为该页面的gridview中的所有条目创建存档记录,即使用户实际上只更新了一个条目。这意味着,当用户更新一个条目时,我们的“EntryLog”表中充斥着其他实际上与前一条相同的归档记录(这意味着该条目实际上没有任何更改)

关于这个问题:我已经通过实现只为gridview中被修改的单行创建存档记录的功能解决了这个问题,但现在我的任务是清除“EntryLog”表中所有那些错误存档的记录。如果我必须用英语表达我要做的事情,我会说:我想删除所有日志(通过LogID[每个归档条目的唯一ID]),其中每个列值与以前的日志列值相同,并且具有相同的“EntryID”(每个条目本身的唯一ID,这意味着“EntryLog”表中每个EntryID都有许多实例。)


我甚至不知道如何开始在T-SQL中安全地表达这一点,我们将非常感谢您提供的任何帮助或朝着正确的方向推动。

因为您要做的就是删除重复记录,如果我没有误解的话,并且从我读到的内容来看,这些记录都是唯一的,您可以使用a按行ID删除,如下所示:

DELETE FROM <TableName>
WHERE <ID>= <value>;
DELETE FROM <TableName>
WHERE <ID> BETWEEN <value1> AND <value2>;
create table #t (log_id int, c varchar(10), d int, log_date date)

insert #t values
(1, 'aaaaa', 1, '20140101'),
(1, 'aaaaa', 1, '20140102'),
(1, 'aaaaa', 1, '20140103'),
(1, 'bbbbb', 1, '20140104'),
(2, 'ccc', 10, '20140103'),
(2, 'cdd', 10, '20140105')
从中删除
式中=;
由于您确实指定它一次创建了许多重复项,因此您可能希望使用指定的来查看参数,以便更快地删除它们。这类似于:

DELETE FROM <TableName>
WHERE <ID>= <value>;
DELETE FROM <TableName>
WHERE <ID> BETWEEN <value1> AND <value2>;
create table #t (log_id int, c varchar(10), d int, log_date date)

insert #t values
(1, 'aaaaa', 1, '20140101'),
(1, 'aaaaa', 1, '20140102'),
(1, 'aaaaa', 1, '20140103'),
(1, 'bbbbb', 1, '20140104'),
(2, 'ccc', 10, '20140103'),
(2, 'cdd', 10, '20140105')
从中删除
介于和之间的位置;
使用
CHECKSUM()
函数查看数据是否相同,无需检查每一列

假设你有这样的东西:

DELETE FROM <TableName>
WHERE <ID>= <value>;
DELETE FROM <TableName>
WHERE <ID> BETWEEN <value1> AND <value2>;
create table #t (log_id int, c varchar(10), d int, log_date date)

insert #t values
(1, 'aaaaa', 1, '20140101'),
(1, 'aaaaa', 1, '20140102'),
(1, 'aaaaa', 1, '20140103'),
(1, 'bbbbb', 1, '20140104'),
(2, 'ccc', 10, '20140103'),
(2, 'cdd', 10, '20140105')
第二行和第三行中的数据是重复的。要清除数据,请执行以下语句:

with x as (
select *, row_number() over(partition by log_id, checksum(log_id, c, d) order by log_date) as rn
from #t
)
delete x where rn > 1

有代码要显示吗?这将帮助我们you@MickyDuncan我的c代码不需要任何帮助,因为我的gridview上的更新按钮本身的功能已经更新,可以做正确的事情,我现在试图解决的问题就是清理EntryLog表中所有错误归档的记录,所以我真的没有任何相关信息代码显示,因为我还不确定如何尝试(在T-SQL中)我在问题中尝试用英语表达的内容。如果有任何其他方法可以让我更清楚地了解我正在尝试做什么,请让我知道我想要删除此“EntryLog”表中的行的唯一方法是如果所有列(EntryLogID除外,因为它们都是唯一的)与具有相同EntryID的前一个EntryLogID记录相同。问题是,在许多情况下,EntryID与前一个日志条目相同,但可能是“有效存档”,因为其中一个(多个)列具有不同的值,这意味着有人实际更改了该特定记录,我希望保留该存档信息。我希望这是有意义的,我发现很难清楚地描述这一点。我不太清楚每条记录有多少列,以及大致有多少条记录需要检查。但您可以在为您知道应该删除的行使用EntryLogID。不幸的是,如果有很多行和/或这些行有很多列,那么这将成为一个相当麻烦的问题。但是我不知道我知道的关于sql的mutch会让它检查查询中的行,所以这就是我所能帮助的。@LeoStotch after se作为dean的awnser,我想我应该尝试一下(因为它在将来对我也会有用),它确实有效+您可以指定要它检查的列的重复项。您只需将#t更改为您的表名和日志id(2X),c和d。当然,您可以添加更多的列。因此,这很可能就是您要查找的查询。是的,这可能就是我要查找的查询!在我接受这一解决方案之前,我将进行一些测试,因为我有超过300000行的数据,我想绝对确保我没有出错只删除有效的存档文件。谢谢!@LeoStotch我也在一个db im上使用过它,我只给了很少的列进行验证,所以至少要有两个重复的,而且它只删除了100+行中的21行,所以它不会删除所有行等等。我认为只要指定所有列,你就可以了。但这样做不会有任何伤害安全备份谢谢dean!因为没有什么比看起来更简单了,我现在意识到我表中的两个字段是唯一的ID,这是另外两个表的主键,这两个表本质上都只是注释。因此,现在我必须弄清楚,如果所有其他字段都是注释,如何检查注释是否与上一个存档中的注释相同是相同的,即使它只与该ID相关,并且如果合法的注释更改在其他表中有效,请尝试保持其完整性。对我来说肯定有点压力,但您的查询将帮助我,所以谢谢!