2011-04-21 94 views
5

我有兩個表:A包含所有數據,表B從A中隨機選擇其數據%25創建。所以A和B有完全相同的列。也沒有獨特的專欄。MySql從另一個表中減去一個表

我想要做的是從A中減去B.任何想法?

+0

當你說減去時我很困惑。你是指過濾器嗎?如果你在另一個表格上過濾一個表格,你需要決定哪一列或哪兩列表格相關聯,以便根據你的過濾器模式。 – RetroCoder 2011-04-21 00:45:21

+0

是的,我想從A中篩選出B中已有的所有數據A – osmanabi 2011-04-21 00:49:50

+0

您想從A表中刪除出現在B中的任何字段,因此不再有公共條目了嗎? – 2011-04-21 00:50:14

回答

0

您需要在原始表創建一個唯一的密鑰(它可以只是一個序列號),並且你可以選擇匹配或不匹配的記錄(25%或相反)

0

我強烈推薦使用自動增加的ID列, 但如果你不能這樣做:

DELETE FROM WHERE a.c1 =(SELECT c1 FROM b)AND a.c2 =(SELECT c2 FROM b)AND a.c3 =(SELECT c3 FROM b)

對不起,剛纔意識到它只適用於一行...

好吧,那麼我得到的僅僅是製造一個ID列,對不起......

8

要查看所有行A除了那些在B

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

要真正從表中刪除AB中的行:

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

@Conrad:它工作在我的MySQL(5.0.51)副本中。你測試過哪個版本? – 2011-04-21 08:10:59

+0

我有5.1它沒有爲我工作 – osmanabi 2011-04-21 08:56:40

+0

我的錯誤,我做了一個非編輯,所以我可以改變我的投票,我刪除了我的評論 – 2011-04-21 15:10:25

1

鑑於您正在比較多個字段,您需要使用exists或joi ñ。因爲你正在尋找刪除它更容易的只是使用存在。

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

我有一個非常類似的要求,你除了礦山,B只是A. 的一個子集。如果你還在尋找一個答案:

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

您需要指定與在A和B上進行內部連接相同的條件。