SQL:选择列值至少出现N次的行?

Dan*_*don 26 sql select

假设我有一个带有两列的SQL表"Celebrities":"fname"和"lname":

fname    | lname    
---------+-------  
Bill     | Clinton
Bill     | Gates
George   | Bush
George   | Clinton
Barack   | Obama
Run Code Online (Sandbox Code Playgroud)

我想编写一个查询,返回表中每个人的名字和姓氏,其姓氏在"lname"列中至少出现两次.我该如何编写这个SQL查询?

Oca*_*tal 62

SELECT fname, lname FROM Celebrities 
WHERE lname IN 
 (SELECT lname FROM Celebrities 
  GROUP BY lname HAVING COUNT (lname) >1)
Run Code Online (Sandbox Code Playgroud)


OMG*_*ies 10

使用JOIN:

SELECT a.*
  FROM CELEBRITIES a
  JOIN (SELECT c.lname
          FROM CELEBRITIES c
      GROUP BY c.lname
        HAVING COUNT(*) >= 2) b ON b.lname = a.lname
Run Code Online (Sandbox Code Playgroud)

使用EXISTS:

SELECT a.*
  FROM CELEBRITIES a
 WHERE EXISTS (SELECT NULL
                 FROM CELEBRITIES c
                WHERE c.lname = a.lname
             GROUP BY c.lname
               HAVING COUNT(*) >= 2) 
Run Code Online (Sandbox Code Playgroud)

  • 一个小的性能注释:我发现EXISTS方法是最快的,然后是JOIN方法,而在远处的第三个方法中.另外:在计数列(lname)上有一个索引也是一个很大的帮助. (3认同)