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 et essayé avec celui-ci aussi p> 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).; P>
blockquote> 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 P>
Key1 < / code>, key2 code> et key3 code> sont des touches principales dans Table2 code>, mais sont des colonnes régulières dans Table1 code> p> p>
3 Réponses :
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
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 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
)
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
);
Afficher
Table1 code> etTable2 code> 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 i> - 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