2011-04-21 2 views
5

J'ai deux tables: A contient toutes les données, la table B créée à partir de A sélectionnant% 25 de ses données de manière aléatoire. Donc A et B ont exactement les mêmes colonnes. De plus, il n'y a pas de colonne unique.MySql Soustraire une table d'un autre

Ce que je veux faire est de soustraire B de A. Des idées?

+0

Je suis confus quand vous dites soustraire. Voulez-vous dire filtre? Si vous filtrez une table sur une autre, vous devez décider quelle colonne ou quelles colonnes reliées entre les deux tables vous souhaitez baser votre modèle de filtre. – RetroCoder

+0

Oui, je veux filtrer toutes les données, qui déjà dans B, de A – osmanabi

+0

Vous voulez supprimer tous les champs qui apparaissent dans B de la table A, donc il n'y a plus d'entrées communes? –

Répondre

0

Vous devez créer une clé unique (il peut être juste un numéro séquentiel) sur la table d'origine et que vous pouvez sélectionner ou les enregistrements sans correspondance (25% ou l'inverse)

0

Je recommande vivement faire une colonne d'identité avec incrémentation automatique, mais si vous ne pouvez pas le faire:

DELETE FROM WHERE A.C1 = (SELECT c1 de b) ET A.C2 = (SELECT c2 de b) ET a.c3 = (SELECT c3 FROM b)

Désolé, je viens de réaliser que cela ne fonctionne que pour une ligne ...

Eh bien, la seule chose que j'ai fait une colonne d'identité, désolé ...

8

Pour afficher toutes les lignes A sauf celles B:

SELECT * FROM A 
WHERE (field1, field2, ..., fieldN) NOT IN 
(SELECT * 
    FROM B 
) ; 

Pour supprimer réellement de la table A les lignes qui sont B:

DELETE FROM A 
WHERE (field1, field2, ..., fieldN) IN 
(SELECT * 
    FROM B 
) ; 
+0

@Conrad: Cela fonctionne dans ma copie de MySQL (5.0.51). Dans quelle version l'avez-vous testé? –

+0

J'ai 5.1 Cela n'a pas fonctionné pour moi non plus – osmanabi

+0

Mon erreur j'ai fait un non-édition afin que je puisse changer mon vote, et j'ai supprimé mon commentaire –

1

Étant donné que vous comparez plusieurs champs dont vous aurez besoin soit d'utiliser existe ou joi n. puisque vous cherchez à supprimer son yi plus facile, il existe juste existe.

 delete from 
     Tablea 
     Where 
     Exists(
       Select 1 
       from tableb 
       where tablea.fielda = tableb.fielda 
        And tablea.fieldb = Tableb.fieldb 
        And...) 
1

J'ai une exigence très semblable à vous, sauf que pour le mien, B est un sous-ensemble de A. Si vous cherchez toujours une réponse:

SELECT * FROM A WHERE NOT EXIST 
(SELECT * FROM B WHERE A.field1 = B.field1 AND A.field2 = B.field2 etc) 

Vous devrez spécifiez la même condition que faire une jointure interne sur A et B.

Questions connexes