2011-04-21 11 views
5

Ho due tabelle: A contiene tutti i dati, la tabella B creata da A selezionando% 25 dei suoi dati in modo casuale. Quindi A e B hanno esattamente le stesse colonne. Inoltre non esiste una colonna unica.MySql Sottrai una tabella da un'altra

Quello che voglio fare è sottrarre B da A. Qualche idea?

+0

Sono confuso quando dici sottrarre. Intendi filtro? Se si filtra una tabella su un'altra, è necessario decidere quale colonna o colonna si collegano tra le due tabelle in cui si desidera basare il modello di filtro. – RetroCoder

+0

Sì, voglio filtrare tutti i dati, che già in B, da A – osmanabi

+0

Vuoi rimuovere tutti i campi che compaiono in B dalla tabella A, quindi non ci sono più voci comuni? –

risposta

0

È necessario creare una chiave univoca (può essere solo un numero sequenziale) sulla tabella originale e la si può selezionare abbinati o record non corrispondenti (il 25% o l'inverso)

0

mi raccomando facendo una colonna ID con incremento automatico, ma se non si può solo fare:

DELETE FROM WHERE a.c1 = (SELECT c1 da B) E A.C2 = (SELECT c2 da B) E a.c3 = (SELEZIONA c3 DA b)

Siamo spiacenti, ho appena realizzato che funziona solo per una riga ...

Bene, allora l'unica cosa che ho ottenuto è fare una colonna ID, mi dispiace ...

8

Per visualizzare tutte le righe in A ad eccezione di quelli in B:

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

Per eliminare effettivamente dalla tabella A le righe che sono in B:

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

@Conrad: Funziona nella mia copia di MySQL (5.0.51). In quale versione l'hai provato? –

+0

Ho 5.1 Non ha funzionato neanche per me – osmanabi

+0

Il mio errore ho fatto un non-edit in modo da poter cambiare il mio voto, e ho cancellato il mio commento –

1

Dato che si sta confrontando più campi che dovrete sia per uso esiste o joi n. dal momento che stai cercando di cancellarlo è più facile usare solo esiste.

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

Ho un requisito molto simile a te, tranne che per la mia, B è solo un sottoinsieme di A. Se siete ancora alla ricerca di una risposta:

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

Si avrebbe bisogno di specificare la stessa condizione di un join interno su A e B.

Problemi correlati