从table1中选择哪些类似的行不出现在table2中?

时间:2011-09-23 20:57:43

标签: mysql

我一直在努力解决这个问题,并且未能找到任何例子来指出我正确的方向。

我有2个MySQL表,结构几乎相同。我正在尝试执行一个返回表1结果的查询,其中表2中没有相同的数据。例如,假设两个表都有3个字段 - fieldA,fieldB和fieldC。我需要排除所有3个字段中数据相同的结果。

甚至可能吗?

4 个答案:

答案 0 :(得分:2)

有几种方法可以做到(假设字段不允许NULL):

SELECT a, b, c FROM Table1 T1 WHERE NOT EXISTS 
  (SELECT * FROM Table2 T2 WHERE T2.a = T1.a AND T2.b = T1.b AND T2.c = T1.c)

SELECT T1.a, T1.b, T1.c FROM Table1 T1 
   LEFT OUTER JOIN Table2 T2 ON T2.a = T1.a AND T2.b = T1.b AND T2.c = T1.c
   WHERE T2.a IS NULL

答案 1 :(得分:1)

select
  t1.*
from
  table1 t1
  left join table2 t2 on 
    t1.fieldA = t2.fieldA and
    t1.fieldB = t2.fieldB and
    t1.fieldC = t2.fieldC
where 
  t2.fieldA is null

请注意,如果两个表中的任何字段均为NULL,则此操作无效。表达式NULL = NULL返回false,因此也会排除这些记录。

答案 2 :(得分:0)

这是EXCEPT的完美用法(关键词/阶段是"set difference")。但是,MySQL lacks it。但没有恐惧,这里有一个解决方法:

Intersection and Set-Difference in MySQL (A workaround for EXCEPT)

请注意,在MySQL中使用NOT EXISTS的方法(根据上面的链接)实际上不太理想,尽管它们在语义上是正确的。有关上述(和替代)方法与MySQL处理的性能差异的解释,请参阅NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: MySQL

  
    

这就是为什么在MySQL中搜索缺失值的最佳方法是使用LEFT JOIN / IS NULL或NOT IN而不是NOT EXISTS。

  

快乐的编码。

答案 3 :(得分:0)

MYSQL中的'左连接'非常慢。下面显示的gifford算法可以将其加速几个数量级。

select * from t1
inner join
(select fieldA from
  (select distinct fieldA, 1 as flag from t1
     union all
   select distinct fieldA, 2 as flag from t2) a
 group by fieldA
 having sum(flag) = 1) b on b.fieldA = t1.fieldA;