0
votes

Sélection des valeurs dans le tableau1 qui ne sont pas dans le tableau2, puis l'insertion de ces valeurs dans la table2 donne une erreur de contrainte de clé primaire?

Je veux sélectionner des lignes d'une table qui ne figurent pas dans une autre table basée sur des correspondances d'identité, puis insérez ces lignes dans l'autre table car elle ne les a pas. J'utilise cette requête xxx

et essayé avec celui-ci aussi xxx

Quand j'exécute la requête, cela me donne une erreur < / p>

violation de la contrainte principale de clé 'pk_table2'. Impossible d'insérer une touche dupliquée dans l'objet 'Table2'. La valeur clé en double est (101278694, 0060, 4PF93LA # ABM).;

Mais je ne comprends pas, parce que j'ai choisi des valeurs qui ne sont pas dans le tableau2, mais cela tente d'insérer des valeurs dupliquées dans le tableau2

Key1 < / code>, key2 et key3 sont des touches principales dans Table2 , mais sont des colonnes régulières dans Table1


4 commentaires

Afficher Table1 et Table2 DDL.


Laquelle de la requête donne l'erreur?


Key1, Key2 et Key3 sont des clés principales dans le tableau2, mais sont des colonnes régulières dans le tableau1 - il clarifie tout. @Gordonlinoff Solution doit vous adapter.


Oui, TABLEG1 avait des données en double que j'essayais d'insérer dans le tableau2. Merci tout le monde


3 Réponses :


0
votes

Vous comparez tout le terrain, vous obtenez donc cette erreur de violation PK. Vous ne devez comparer que les valeurs PK

Exemple: P>

TABLE2 1
PK1    COL1_VALUE         COL2_VALUE

TABLE 2
PK1    COL1_OTHER_VALUE   COL2_OTHER VALUE


0 commentaires

2
votes

Vous devez avoir plus d'une ligne dans le tableau 1 qui a les valeurs (101278694, 0060, 4PF93LA # ABM). Votre requête nécessite une certaine logique pour résoudre les duplicats. Vous pouvez faire quelque chose comme ça xxx pré>

mais peut-être que max n'est pas ce que vous voulez. Vous pouvez également faire quelque chose comme celui-ci qui ne tire que des ensembles distincts de clés qui ne sont pas déjà en T2 et qui ne sont pas associés à plusieurs combinaisons Value1, Value2 dans T1 P>

insert into table2 (key1, key2, key3, some_value1, some_value2)
select distinct t1.key1, t1.key2, t1.key3, some_value1, some_value2
from table1 t1
where not exists (
    select 1
    from table1 t3
    where t3.key1 = t1.key1 and t3.key2 = t1.key2 and t3.key3 = t1.key3 and
         (t3.value1 != t1.value1 or t3.value2 != t1.value2)
) and not exists (
    select 1
    from table2 t2
    where t2.key1 = t1.key1 and t2.key2 = t1.key2 and t2.key3 = t1.key3
)


0 commentaires

2
votes

Votre deuxième version semble que cela devrait fonctionner. . . Sauf si il y a des doublons dans les données insérées.

insert into table2 (key1, key2, key3, some_value1, some_value2)
    select t1.key1, t1.key2, t1.key3, some_value1, some_value2
    from (select t1.*,
                  row_number() over (partition by key1, key2, key3) as seqnum
          from table1 t1
         ) t1
    where seqnum = 1 and
          not exists (select 1
                      from table2 t2
                      where t2.key1 = t1.key1 and t2.key2 = t1.key2 and t2.key3 = t1.key3
                     );


0 commentaires