【问题标题】:Checking for duplicates and removing row from a DataTable but appending column value检查重复项并从 DataTable 中删除行但附加列值
【发布时间】:2014-07-03 07:58:23
【问题描述】:

有一个稍微棘手的问题。我有一个包含数千行或行的数据表。它有两列。使用其中一列作为我需要检查重复项的键。如果有,我需要将另一列中的值添加到一列中并删除重复的行。我能够找到重复项并添加值。但是当我删除一行时,由于索引已更改,它会影响其余行。另外,我不确定我是否做得有效率。请指教。

   Cate_Id      TrxnCount
 ----------       ----------
    ER01              0
    ER02              0
    ER41              0
    ER53              1
    ER53              2
    ER56              0
    ER56              0
    ER56              0
    ER57              8
    ER57              9

删除和添加值后

 Cate_Id           TrxnCount
 ----------       ----------
    ER01              0
    ER02              0
    ER41              0
    ER53              3 
    ER56              0
    ER57              17

我怎样才能以简单有效的方式实现这一目标。请指教。

这是我所做的:

  List<DataRow> rowsToDelete = new List<DataRow>();
  int newValue = 0;
  for (int i = 15; i < dt.Rows.Count; i++)
  {
    if (i > 0)
    {
       // Compare with previous row using index
      if (dt.Rows[i]["Cate_Id "].ToString() == dt.Rows[i - 1]["Cate_Id "].ToString())
      {
        newValue = Convert.ToInt32(dt.Rows[i]["TrxnCount"].ToString()) + Convert.ToInt32(dt.Rows[i - 1]["TrxnCount"].ToString());
        dt.Rows[i]["TrxnCount"] = newValue;
        rowsToDelete.Add(dt.Rows[i - 1]);
         newValue = 0;
      }
    }
      if (i < dt.Rows.Count - 1)
      {
        if (dt.Rows[i]["Cate_Id"].ToString() == dt.Rows[i + 1]["Cate_Id"].ToString())
        {
         newValue = Convert.ToInt32(dt.Rows[i]["TrxnCount"].ToString()) + Convert.ToInt32(dt.Rows[i - 1]["TrxnCount"].ToString());
         dt.Rows[i]["TrxnCount"] = newValue;
         rowsToDelete.Add(dt.Rows[i - 1]);
         newValue = 0;
         }
       }     
   }


  foreach(var r inrowsToDelete )
  dt.Rows.Remove(r);

【问题讨论】:

  • 我已经在数据库端提供了一种方法。如果这不是您所需要的,请让我知道更多关于您使用它的详细信息,以便为您提供替代解决方案。

标签: c# asp.net datatable


【解决方案1】:

要以更有效的方式执行此操作,您需要在 DB 端执行此操作。

您可以编写一个执行此操作的存储过程:

  • 选择按 Cate_Id 分组的 TrxnCount 的总和和计数,计数 > 1
  • 将结果存储在重复的临时表中
  • 从原表中删除重复临时表中存在Cate_Id的所有记录
  • 将临时表中的所有值插入原始表中

这比在客户端执行要高效得多。

顺便说一句,这有一个可怕的设计缺陷:桌子没有PK,这是一个非常糟糕的主意。

存储过程的代码(我假设原始表名是T

BEGIN TRAN

SELECT Cate_Id, SUM(T.TrxnCount) AS TrxnCount 
INTO #dups
FROM T GROUP BY T.Cate_Id HAVING COUNT(*) > 1

DELETE FROM T WHERE Cate_Id IN (SELECT Cate_Id FROM #dups)
INSERT INTO T SELECT * FROM #Dups

COMMIT TRAN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 2020-12-07
    • 2013-08-01
    • 2018-03-29
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    相关资源
    最近更新 更多