webForumDet fria alternativet

Slå samman dubletter i databas

23 svar · 827 visningar · startad av devotion · sida 2 av 2

devotionMedlem sedan jan. 20013 582 inlägg
#21

Hej igen!

Har kört lite tester idag och kommit fram till att transaktionen nog inte gör så som jag tänkt mig...

Den behandlar dubletter på hela tabellen; tblMaterial Det ska den ju iofs göra, men det ska ju vara kopplat till ett speciellt uppdrag.

Ska försöka förklara lite tydligare... :)
Om ett uppdrag har TaskId 100 och detta har dubletter på artikelnr 0000040 ska dessa slås ihop

Uppdraget med TaskId 110 skall inte påverkas, även om artikelnr 0000040 även ingår där.

Som det är nu, tror jag att alla dubletter i tabellen slås ihop oavsett vilket TaskId de tillhör

Dvs. summerinegn skall bara göras inom samma TaskId.

Hoppas ni fattar! :)

Jag bifogar en bildserie där första bilden; before_trans.png visar databasen före transaktionen. after_trans.png visar resultatet efter och önskat_resultat.png visar hur jag vill att det ska bli

Mvh
Henrik

before_trans.pngafter_trans.pngönskat_resultat.png
devotionMedlem sedan jan. 20013 582 inlägg
#22

Har lagt till lite förklarande bilder... :)

Mvh
Henrik

emissionMedlem sedan dec. 19996 721 inlägg
#23

Det har inte med transaktionen att göra. Den är bara ett säkerhetsbälte och påverkar på intet sätt vad resultatet av frågorna blir.

Du får helt enkelt utöka dina villkor:

update q set Amount = (select sum(Amount)
      from tblMaterial 
   where tblMaterial.ArtNr = q.ArtNr[b] and tblMaterial.Taskid=q.TaskId[/b])
from tblMaterial as q
delete from tblMaterial
    where id not in
          (select max(id)
              from tblMaterial as q
           where tblMaterial.ArtNr= q.ArtNr[b] and tblMaterial.TaskId= q.TaskId[/b])
devotionMedlem sedan jan. 20013 582 inlägg
#24

Det verkar fungera perfekt! :)

DECLARE @updaterr int, @deleteerr int
BEGIN TRAN
update q set Amount = (select sum(Amount)
      from tblMaterial 
   where tblMaterial.ArtNr = q.ArtNr and tblMaterial.Taskid = q.TaskId)
from tblMaterial as q 
 where ArtNr in
    (select ArtNr
        from tblMaterial
      group by ArtNr
     having count(*) > 1)

SELECT @updaterr=@@ERROR

delete from tblMaterial
    where id not in
          (select max(id)
              from tblMaterial as q
           where tblMaterial.ArtNr = q.ArtNr and tblMaterial.TaskId = q.TaskId)

SELECT @deleteerr=@@ERROR
IF (@updaterr<>0 or @deleteerr<>0)
BEGIN
   ROLLBACK TRAN
END
ELSE
BEGIN
  COMMIT TRAN
END

Mvh
Henrik

138 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)