2011-04-21 129 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上进行内部连接相同的条件。

相关问题