我有一个包含两列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,但并没有真正做我想做的事。
答案 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时,你必须记住,没有索引就无法快速执行此查询,因为它不支持:
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(取决于版本)或多或少关于子查询的脑力,尽管它往往会变得更好。
尝试:
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);