Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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
更新一条重复记录并删除其余记录-经典ASP&SQL Server 2008r2_Sql_Sql Server_Asp Classic_Sql Server 2008 R2 - Fatal编程技术网

更新一条重复记录并删除其余记录-经典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单位?转变的逻辑是什么?同样,你如何决定保留哪一个,删除哪一个?