在SQL中仅更新一行重复行

时间:2015-12-01 15:24:19

标签: sql sql-server

我有一个问题。我试图搜索其他问题,但没有解决我的问题,所以我试着解释一下。

我有一个包含7列主键的表:

Istituto,Filiale,Cdg,Progressivo,DataInserimento,Operatore,Testo

前4列是键,并且有时间记录有simil键(相同的Istituto,Cdg和Progressivo)但是同样的DataInserimento(这是DATETIME字段),我会找到这个记录并更改一个(或更多,如果有更多比两个记录具有相同的日期和Cdg)为彼此的不同日期添加100毫秒。

例如:

Istituto Filiale cdg Progressivo DataInserimento Operatore Testo
1  12 456 1 12/11/2015 12:00:00:200 UGO QUALCOSA
1  123 456 1 12/11/2015 12:00:00:200 UGO QUALCOSA2
1  124 456 1 12/11/2015 12:00:00:200 UGO QUALCOSA3

我想在查询之后这样做:

Istituto Filiale cdg Progressivo DataInserimento Operatore Testo
1  12 456 1 12/11/2015 12:00:00:200 UGO QUALCOSA
1  123 456 1 12/11/2015 12:00:00:300 UGO QUALCOSA2
1  124 456 1 12/11/2015 12:00:00:400 UGO QUALCOSA3

我能解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

在此UPDATE中,如果存在具有相同3个主键字段的另一行(Filiale除外),则更改dataInserimento在行的前一行的基础上添加100 ms的倍数 试试这个:

UPDATE yourtable
SET dataInserimento = DATEADD(ms, 100 *
    (SELECT COUNT(*)
    FROM yourtable T3
    WHERE T3.Istituto = yourtable.Istituto
    AND T3.cdg = yourtable.cdg
    AND T3.Progressivo = yourTable.Progressivo
    AND T3.filiale < yourTable.filiale)
, dataInserimento)
WHERE EXISTS(
    SELECT 'next'
    FROM yourtable t2
    WHERE T2.Istituto = yourtable.Istituto
    AND T2.cdg = yourtable.cdg
    AND T2.Progressivo = yourTable.Progressivo
    AND T2.filiale < yourTable.filiale
)

答案 1 :(得分:1)

你可以这样做:

UPDATE ToUpdate SET DataInserimento = SQ.NewDate
FROM TheTable ToUpdate
JOIN (
    SELECT T.Istituto, T.Cdg, T.Progressivo, T.Filiale, DATEADD(ms, ROW_NUMBER() OVER (PARTITION BY T.Istituto, T.Cdg, T.Progressivo, T.DataInserimento ORDER BY T.Filiale) * 100, T.DataInserimento) AS NewDate
    FROM (
        SELECT Istituto, Cdg, Progressivo, DataInserimento, MIN(Filiale) AS MINFiliale
        FROM TheTable 
        GROUP BY Istituto, Cdg, Progressivo, DataInserimento
        HAVING COUNT(*) > 0
    ) AS Groups
    JOIN TheTable T ON Groups.Istituto = T.Istituto AND Groups.Cdg = T.Cdg AND Groups.Progressivo = T.Progressivo AND Groups.DataInserimento = T.DataInserimento
    WHERE T.Filiale <> MINFiliale
) SQ ON SQ.Istituto = ToUpdate.Istituto AND SQ.Cdg = ToUpdate.Cdg AND SQ.Progressivo = ToUpdate.Progressivo AND SQ.Filiale = ToUpdate.Filiale