J'ai 2 tables nommées BM_Data1 & BM_Data1_May62019 . Les deux tableaux contiennent les mêmes données que BM_Data1_May62019 est la copie de la table BM_Data1 . Mais BM_Data1 a quelques lignes supplémentaires, comment puis-je supprimer ces lignes supplémentaires de BM_Data1 et le rendre identique à BM_Data1_May62019 .
J'ai obtenu le lignes supplémentaires à l'aide de la requête suivante.
SELECT * FROM (SELECT * FROM BM_DATA1 EXCEPT SELECT * FROM BM_DATA1_MAY62019) a
Il y a 7803 lignes supplémentaires, comment puis-je les supprimer de la table BM_Data1 ?
Merci
5 Réponses :
utilisez simplement supprimer avec une sous-requête corrélée
delete from [BM_DATA1]
where not exists
(select 1
from [BM_DATA1_MAY62019]
where [BM_DATA1_MAY62019].RECID = [BM_DATA1].RECID -- put here here identified column name
)
L'utilisation de cela génère l'erreur suivante Nom d'objet invalide De plus, cette requête ne précise pas de quelle table il doit supprimer les lignes
J'ai eu cette erreur en utilisant cette requête Impossible de mettre à jour la vue ou la fonction «cte» car elle contient des agrégats, ou une clause DISTINCT ou GROUP BY, ou un opérateur PIVOT ou UNPIVOT.
Utilisez une instruction MERGE avec WHEN NOT MATCHED BY SOURCE THEN DELETE .
MERGE fonctionne comme un JOIN code> des sortes, et vous devez être en mesure d'identifier quelles lignes sont égales. Vous faites cela par la clause ON - pour vous, ce serait RECID.
Je vous suggère de les exécuter d'abord dans une transaction, donc vous vérifiez que vous ne supprimez que les données que vous souhaitez - et ne validez la transaction que lorsque vous êtes sûr d'avoir la bonne configuration. Si quelque chose ne va pas, vous pouvez revenir en arrière
BEGIN TRANSACTION MERGE BM_DATA1 AS Target USING BM_DATA1_MAY62019as Source ON (Target.RECID = Source.RECID) WHEN NOT MATCHED BY SOURCE THEN DELETE; SELECT * FROM BM_DATA1 -- ROLLBACK TRANSACTION -- Uncomment and use this if it deleted the wrong data -- COMMIT -- Uncomment and use this if it deleted the right data!
il n'a supprimé que 613 enregistrements au lieu de 7803
Comme vous avez confirmé que RECID est commun dans les deux tables avec une valeur unique, vous pouvez essayer ce script suivant
DELETE FROM BM_DATA1
WHERE RECID NOT IN
(
SELECT RECID FROM BM_DATA1_MAY62019
)
il n'a supprimé que 613 enregistrements au lieu de 7803
Cela signifie que d'autres RECID sont communs entre deux tables.
ce qui signifie que la table BM_DATA1 a plusieurs entrées avec le même RECID que BM_DATA1_MAY62019
vous devez utiliser une autre colonne avec une colonne unique, peut être un journal du temps si vous avez dans votre ensemble de données
Après avoir utilisé la requête ci-dessus, les deux tables ont le même nombre de lignes, c'est-à-dire 255276 , mais lorsque j'exécute EXCEPT pour ces tables, il affiche toujours 7190 lignes. Je me demande pourquoi?
Cela signifie qu'il y a une différence de données dans d'autres colonnes avec le même RECID. SAUF considérez la combinaison des données de toutes les colonnes.
J'ai inclus du DDL pour que vous puissiez l'exécuter vous-même pour vous aider à comprendre l'exemple. La colonne ID est celle qui est commune aux deux tables et vous supprimez les lignes de A qui ne sont pas dans B
create table #data_a( id int, val int) create table #data_b( id int, val int) insert into #data_a select 1, 1 insert into #data_a select 2, 4 insert into #data_a select 3, 5 insert into #data_a select 4, 5 insert into #data_a select 5, 5 insert into #data_a select 6, 5 insert into #data_a select 7, 5 insert into #data_a select 8, 5 insert into #data_b select 1, 1 insert into #data_b select 2, 4 insert into #data_b select 3, 5 insert into #data_b select 4, 5 insert into #data_b select 5, 5 -- delete the extra rows in A delete a from #data_a as a left join #data_b as b on a.id = b.id where b.id is null -- we can see the rows are no longer in B select * from #data_a select * from #data_b drop table #data_a drop table #data_b
delete from t1 where id not in (select id from t2)
Quelles colonnes d'identification avez-vous dans ces tableaux?
y a-t-il une relation entre ces tables?
Il n'y a pas de relation entre ces tables,
BM_DATA1_MAY62019est une ancienne sauvegarde deBM_DATA1Mais vous devez avoir quelque chose qui identifie chaque ligne? Comme une pièce d'identité ou quelque chose d'unique?
Cela signifie que vous avez les mêmes valeurs de clé primaire dans les deux tables, n'est-ce pas? ou vous n'avez pas trop de pk?
En fait, je ne sais pas si une colonne contient des données UNIQUES, sinon il me sera facile de supprimer en utilisant une simple requête de suppression
Dois-je d'abord créer une colonne supplémentaire avec incrémentation automatique dans
BM_DATA1?Toute table doit avoir un PK, quelque chose d'unique avec lequel vous pouvez identifier cette ligne spécifique. Si vous avez des ID correspondants dans les deux tables, vous pouvez utiliser une instruction
MERGEpour le supprimer.Pouvez-vous partager la structure de votre table?
@Qirel Je l'ai trouvé, dans les deux tableaux Colonne
RECIDcontenant des valeurs uniques.