2017-09-07 1 views
0

J'ai ci-dessous la requête de fusion où je veux mettre à jour la date et pour le problème de perfromance j'utilise la logique ROWID.Fusionner à l'aide de la mise à jour insérer de nouvelles lignes

Mais je voudrais savoir si elle insère de toute façon de nouvelles lignes? Je veux juste mettre à jour la table TEST_GRP et ne veux pas l'insertion de nouvelles lignes. Comme j'utilise la logique ROWID pour la première fois, je ne suis vraiment pas sûr si elle insère de nouvelles lignes ou simplement mettre à jour la table.

MERGE INTO TEST_GRP tgt 
    USING (SELECT ID, 
       ROWID r_id, 
       row_number() over (partition by ID ORDER BY DT_DATE) rn 
     FROM TEST_GRP) src 
    ON (tgt.rowid = src.r_id AND src.rn = 1) 
WHEN MATCHED THEN 
    UPDATE SET DT_DATE = to_date('01.01.2017', ''dd.mm.yyyy'') 
    WHERE DT_DATE != to_date('01.01.2016', ''dd.mm.yyyy'') 
    and DB_NAME = 'ARD'; 
+0

Je suis curieux de savoir pourquoi les dates sont différentes dans votre mise à jour par rapport à la clause where. "Mise à jour au 01.01.2017 sauf si la date est 01.01.2016". –

Répondre

1

Vous ne devez pas ajouter la clause d'insertion à merge déclaration comme indiqué dans le docs:

merge_update_clause ... Vous pouvez spécifier cette clause par lui-même ou avec le merge_insert_clause

Et vous n'avez pas votre code, donc pas d'insertion (s) va se passer.

merge_insert_clause:

2

Il mettra à jour les lignes sans problème et ne pas insérer de nouvelles lignes. Lors de votre mise à jour probation probation, il peut vous causer un problème de devis au masque de format SET DT_DATE = to_date ('01 .01.2017 ',' 'jj.mm.aaaa' ') DT_DATE! = To_date ('01 .01.2016')

, '' dd.mm.yyyy '')