更新一条重复记录并删除其余记录-经典ASP&SQL Server 2008r2
我想更新一条重复记录并删除其余记录 我有一张桌子更新一条重复记录并删除其余记录-经典ASP&SQL Server 2008r2,sql,sql-server,asp-classic,sql-server-2008-r2,Sql,Sql Server,Asp Classic,Sql Server 2008 R2,我想更新一条重复记录并删除其余记录 我有一张桌子 id start unit 1 1 a 2 1 a 3 2 a 4 2 a 5 3 b 我想变成 id start unit 1 1 b 3 2 b 5 3 b 我已经找到了重复项,但我无法处理它们——或者在下面的示例中,我最终删除了所有重复项,而没有保留第一条记录
id start unit
1 1 a
2 1 a
3 2 a
4 2 a
5 3 b
我想变成
id start unit
1 1 b
3 2 b
5 3 b
我已经找到了重复项,但我无法处理它们——或者在下面的示例中,我最终删除了所有重复项,而没有保留第一条记录。
我也不相信这种方法是解决问题的最佳方法
strSQL_dup = "SELECT start_date, id
FROM test
WHERE start_date IN
(SELECT start_date
FROM test WHERE adId = " & adId & " AND Unit = " & scId & "
GROUP BY start_date HAVING (COUNT(start_date ) > 1) )
GROUP BY test.id, start_date"
Set rsSQL_dup = conn.Execute(strSQL_dup)
Do While Not rsSQL_dup.EOF
start_date = rsSQL_dup.Fields("start_date").value
id = rsSQL_dup.Fields("id").value
'Response.Write("<p> "&start_date&" | "& id & " update me </p>"
if bookingstate = "Provisional" Then
dateStatusNo = 8
else
dateStatusNo = 1
End if
'Response.Write("<p> " & id & " update me</p>")
strSQL_dup_update = "UPDATE test SET Unit = '" & dateStatusNo & "' WHERE id = '" & id & "' "
Set rsSQL_dup_update = conn.Execute(strSQL_dup_update)
strSQL_delete = "SELECT top 1 start_date, id FROM test WHERE start_date = " & start_date
Set rsSQL_delete = conn.Execute(strSQL_delete)
Do While Not rsSQL_delete.EOF
start_date = rsSQL_delete.Fields("start_date").value
id = rsSQL_delete.Fields("id").value
'Response.Write("<p> "&start_date&" | "& id & " delete me</p>")
strSQL_dup_delet = "DELETE FROM test WHERE id = '" & id & "' "
Set rsSQL_dup_delet = conn.Execute(strSQL_dup_delet)
rsSQL_delete.MoveNext()
Loop
rsSQL_dup.MoveNext()
Loop 'End Do While Not rsSQL_dup.EOF
Loop
老实说。您可能可以将其与事务中的一个合并或多个语句放在一起。但是,为什么不创建一个临时表,截断原始表,然后重新插入数据呢
select min(id), start, 'b' as unit
into #test
from test
group by start;
truncate table test;
insert into test(id, start, unit)
select id, start, unit
from #test;
跌落台试验 我同意@Ken white如何将a更改为b,但如果您想删除重复记录 为什么不使用像这样的独立命令呢
select distinct start_date
FROM test
如果希望运行查询,则可以将其与查询相结合,如
select distinct start_date
FROM test WHERE start_date IN
(SELECT start_date
FROM test WHERE adId = " & adId & " AND Unit = " & scId & "
GROUP BY start_date HAVING (COUNT(start_date ) > 1) )
GROUP BY test.id, start_date"
如果要删除记录,请使用此查询
WITH test AS(
SELECT [col1], [col2], [col3], [col4], [col5], [col6], [col7],
RN = ROW_NUMBER()OVER(PARTITION BY col1 ORDER BY col1)
FROM dbo.Table1
)
DELETE FROM test WHERE RN > 1
我不明白你想要的结果。例如,ID为2和3且均具有单位a的行如何转变为具有单位b'的行?同样的问题也适用于ids4和ids5,顺便说一句,它们是单元a`和b,但却变成了b。我糟糕的计划是选择重复的,更新列单元,然后删除其中一个重复的行。或者它可以通过删除副本然后更新剩余的行来工作?您还没有回答我的问题。:-两行a单位如何神奇地转换成一行b单位?转变的逻辑是什么?同样,你如何决定保留哪一个,删除哪一个?