2011-04-21 23 views
5

Mam dwie tabele: A zawiera wszystkie dane, tabela B utworzona od A losowo wybiera% 25 swoich danych. Zatem A i B mają dokładnie te same kolumny. Również nie ma unikalnej kolumny.MySql Odejmij tabelę od innej

Co chcę zrobić, to odjąć B od A. Jakieś pomysły?

+0

Jestem zdezorientowany, kiedy mówisz, odejmij. Masz na myśli filtr? Jeśli filtrujesz jedną tabelę na drugiej, musisz zdecydować, która kolumna lub kolumny są powiązane z tabelą, na której chcesz oprzeć wzorzec filtru. – RetroCoder

+0

Tak, chcę odfiltrować wszystkie dane, które już w B, od A – osmanabi

+0

Chcesz usunąć wszystkie pola, które pojawiają się w B z tabeli A, więc nie ma już wspólnych wpisów? –

Odpowiedz

0

Musisz utworzyć unikatowy klucz (może to być po prostu kolejny numer) na oryginalnym stole i może nie wybierzesz dopasowane lub niedopasowane rekordy (25% lub odwrotności)

0

Bardzo polecam czyniąc kolumnę ID z auto przyrostu, ale jeśli nie można po prostu zrobić:

DELETE FROM WHERE a.c1 = (SELECT C1 z B) i a.c2 = (SELECT FROM C2 b) i a.c3 = (SELECT c3 FROM b)

Niestety, właśnie zdałem sobie sprawę, że działa tylko w jednym rzędzie ...

Więc jedyne co mam robi kolumnę identyfikatora, przepraszam ...

8

aby wyświetlić wszystkie wiersze w A wyjątkiem tych, w B:

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

Aby faktycznie usunąć z tabeli A wiersze, które są w B:

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

@Conrad: Działa w mojej kopii MySQL (5.0.51). Którą wersję testowałeś? –

+0

Mam 5.1 To nie działało dla mnie ani – osmanabi

+0

Mój błąd zrobiłem non-edit, dzięki czemu mogłem zmienić swój głos, i skasowałem mój komentarz –

1

Biorąc pod uwagę, że jesteś porównując wiele pól musisz albo użycie istnieje lub Joi n. ponieważ chcesz usunąć jego łatwiejszą wersję, po prostu istnieje.

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

Mam bardzo podobny do ciebie z wyjątkiem wymogu, że dla kopalni, B jest tylko podzbiorem A. Jeśli nadal szuka odpowiedzi:

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

Trzeba by Podaj ten sam warunek, co w przypadku łączenia wewnętrznego na A i B.