ci-dessous est la donnée que j'ai. J'ai besoin d'une ligne dupliquée à supprimer, mais à la mise à jour parallien de dernière mise à jour ID utilisateur et dernier timbre de mise à jour.
Il y a 3 autres colonnes ci-dessous, comme une clé primaire unique et la dernière mise à jour HYESTAMP et la dernière mise à jour ID utilisateur. P>
p>
Lors de l'exécution de la requête ci-dessous, il supprimait les 8 lignes au lieu de 4. Je ne suis pas capable d'identifier ce qui ne va pas dans la requête, P>
merge into TestTable tgt
using (select ID,
Date,AMT,
Currency,
Value,
count(*) over (partition by ID, Date, AMT,Currency,Value ) grp_count,
row_number() over (partition by ID, Date, AMT,Currency,Value order by ID) rn
from TestTable
)src
-- where rn > 1) src
on (tgt.ID = src.ID and src.rn = 2)
when matched then
update set tgt.LastUpdtUser= 'testing',tgt.LastUpdateTime = SYSDATE
where src.rn = 2
delete where src.rn = 2;
3 Réponses :
basé sur ce que vous demandez
Il semble que vous souhaitiez supprimer des entrées identiques ayant (ID, date, amt, devise, valeur) p>
Si tel est le cas, vous pouvez utiliser la suppression Dupliquer comme suit p> voici le lien dbfiddle avec un exemple complet. p> https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=572C0AAB871A67DA16099 P> P>
Dans la requête de fusion, il supprime tout, puisque la condition que vous avez des correspondances spécifiées avec toutes les lignes -> sur (tgt.id = src.id et src.id = 2). Vous dites ici correspondre à tous les enregistrements de TGT, dont l'ID correspond à la SRC_Block qui a RN = 2. Et puisque toutes vos lignes ont des entrées en double, il y a toujours un enregistrement avec RN = 2 pour chacun de la clause partitionnée
Voici une solution alternative:
delete from testtable
where rowid in (
SELECT rowid FROM testtable a
WHERE rowid > ANY
(SELECT rowid FROM testtable b
WHERE a.id = b.id
));
On dirait que vous essayez d'éliminer les lignes en double, tout en mettant à jour la rangée restante.
Voici comment je le ferais: P>
MERGE INTO testtable tgt
USING (SELECT ROWID r_id,
ID,
dt,
amt,
currency,
VALUE,
COUNT(*) OVER (PARTITION BY ID, dt, amt, currency, VALUE) grp_count,
row_number() OVER (PARTITION BY ID, dt, amt, currency, VALUE ORDER BY lastupdttime) rn
FROM testtable) src
ON (tgt.rowid = src.r_id and src.grp_count > 1)
WHEN MATCHED THEN
UPDATE SET tgt.lastupdtuser = 'z',
tgt.lastupdttime = SYSDATE
DELETE WHERE src.rn > 1;
Votre mise à jour ne devrait-elle pas être
où src.rn = 1 code>?Oui, il a été modifié quand je collais ici, mais le point est supprimé ne se produit pas ici. Son élimination des 8 rangées quand il ne devrait que supprimer 4.
Mais
(tgt.id = src.id et src.rn = 2) code> empêchera les lignes avecrn = 1 code> à sélectionner et donc être candidats à la mise à jour, non?