有一个棘手的问题。我有一个数千或数行的数据表。它有两列。使用其中一列作为密钥我需要检查重复项。如果有,我将需要将另一列中的值添加到一列中并删除重复的行。我能够找到重复并添加值。但是当我删除一行时,它会影响其余部分,因为索引已被更改。另外,我不确定我是否有效率。请指教。
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);
答案 0 :(得分:0)
要以更有效的方式在数据库方面执行此操作。
您可以编写执行此操作的存储过程:
在客户端这样做效率要高得多。
顺便说一句,这有一个可怕的设计缺陷:表没有PK,这是非常糟糕的主意。 tyhe存储过程的代码(我假设原始表名是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