MySQL在两列中的区别

时间:2011-05-07 15:30:25

标签: mysql sql

我有一个包含两列A和B列的表,它们包含相同域的值,假设我想找到仅出现在A但不出现在B中的值,即

A有1,2,3 B有2,3

所以我的答案是A - B = {1}

所以我写的SQL查询是

SELECT DISTINCT(A) 
  FROM DB
 WHERE A NOT IN (SELECT DISTINCT(B) 
                   FROM DB);

它不起作用并且永远不会响应(大约8000条记录),有没有人有类似上述的解决方案?感谢。

我发现了一些线索,例如MySQL: difference of two result sets,但并没有真正做我想做的事。

3 个答案:

答案 0 :(得分:0)

以下表现如何?如果性能不佳,请确保两列都有索引。

SELECT DISTINCT DB1.A
FROM            DB DB1
LEFT JOIN       DB DB2
ON              DB2.B = DB1.A
WHERE           DB2.B IS NULL

答案 1 :(得分:0)

使用MySQL时,你必须记住,没有索引就无法快速执行此查询,因为它不支持:

  • 哈希聚合
  • 哈希联接
  • 合并加入
  • 哈希IN()检查
  • 不要考虑这样做:
    EXPLAIN ANALYZE SELECT DISTINCT a FROM t WHERE a NOT IN (SELECT b FROM t);
    HashAggregate  (actual time=7.283..7.428 rows=827 loops=1)
    ->  Seq Scan on t (actual time=4.159..6.778 rows=1697 loops=1)
        Filter: (NOT (hashed SubPlan 1))
          SubPlan 1
          ->  Seq Scan on t  (actual time=0.006..1.497 rows=8000 loops=1)
     Total runtime: 6.840 ms

同样,MySQL(取决于版本)或多或少关于子查询的脑力,尽管它往往会变得更好。

  • 在A列上创建索引
  • 在B列上创建索引

尝试:

SELECT DISTINCT t1.a 
FROM table t1 
LEFT JOIN table t2 ON (t1.a=t2.b)
WHERE t2.b IS NULL

或者:

SELECT DISTINCT a 
FROM table t1 
WHERE NOT EXISTS( 
 SELECT * FROM t2 WHERE t2.b=t1.a
)

答案 2 :(得分:0)

SELECT DISTINCT d1.A 
FROM DB d1 LEFT JOIN DB d2 ON d1.A=d2.B 
WHERE de.B IS NULL

ALTER TABLE DB ADD INDEX a_idx(A);

ALTER TABLE DB ADD INDEX b_idx(B);