我一直在努力解决这个问题,并且未能找到任何例子来指出我正确的方向。
我有2个MySQL表,结构几乎相同。我正在尝试执行一个返回表1结果的查询,其中表2中没有相同的数据。例如,假设两个表都有3个字段 - fieldA,fieldB和fieldC。我需要排除所有3个字段中数据相同的结果。
甚至可能吗?
答案 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;