如何在具有1000万条记录的表中快速选择列中具有2个值的行?

Lim*_*ing 5 sql performance

我有一个表(TestFI),例如以下数据

FIID   Email
---------
null a@a.com
1    a@a.com   
null b@b.com    
2    b@b.com    
3    c@c.com    
4    c@c.com    
5    c@c.com    
null d@d.com    
null d@d.com
Run Code Online (Sandbox Code Playgroud)

我需要两次出现的记录,并且FIID的1行是空的,而其中一行不是.对于上述数据,只有"a@a.com和b@b.com"符合要求.

我能够像这样构建一个多级查询

    Select
FIID,
Email
from
TestFI
where
Email in
(
    Select
        Email
    from
    (
        Select
                Email
            from
                TestFI
            where
                Email in 
                (
                select
                    Email
                from
                    TestFI
                where
                    FIID is null or FIID is not null
                group by Email
                having 
                    count(Email) = 2
                )
                and
                FIID is null
    )as Temp1
    group by Email
    having count(Email) = 1
)
Run Code Online (Sandbox Code Playgroud)

然而,花了近10分钟才能完成1000万条记录.有一个更好的方法吗?我知道我必须在这里做一些愚蠢的事情.

谢谢

fth*_*lla 7

我会尝试这个查询:

SELECT   EMail, MAX(FFID)
FROM     TestFI
GROUP BY EMail
HAVING   COUNT(*)=2 AND COUNT(FIID)=1
Run Code Online (Sandbox Code Playgroud)

它将返回EMail列,以及FFID的非null值.FFID的另一个值为null.