我们必须在同一个表上查询。表'Foo',结构是这样的,
Foo
-------------
ID MID AID STATUS
1 12 88 A
2 12 88 B
3 13 88 A
4 13 88 B
5 14 88 A
6 15 88 A
所以我们只需要那些STATUS = A但不是STATUS!= B的记录。我们成功创建了嵌套查询。但是这张表包含了数百万条记录,并且耗费了太多时间。
使用嵌套查询
SELECT FO.MID FROM FOO FO WHERE FO.AID = 188 AND FO.STATUS = 'A' AND FO.MID NOT IN
(SELECT FO.MID FROM FOO FO WHERE FO.AID = 188 AND FO.STATUS = 'B' AND FO.MID IS NOT NULL)
那么如何使用JOIN快速实现这一目标呢?
答案 0 :(得分:1)
一种方法是聚合:
select fo.mid
from foo fo
group by fo.mid
having sum(fo.status = 'A') > 0 and
sum(fo.status = 'B') = 0;
如果你有一张mid
表,那么最好的方法可能就是:
select m.mid
from mids m
where exists (select 1 from foo where fo.mid = m.mid and fo.status = 'A') and
not exists (select 1 from foo where fo.mid = m.mid and fo.status = 'B');
对于此查询的效果,您需要foo(mid, status)
上的索引。
答案 1 :(得分:1)
我有一个关于MID的索引,那么下面的查询可能有帮助。
SELECT FO.MID
FROM FOO FO
WHERE FO.AID = 88 AND FO.STATUS = 'A' AND
NOT EXISTS (SELECT 1 FROM FOO f WHERE fo.MID=f.MID AND F.STATUS = 'B')