只列出重复的名字

List only repeating names

| personid | first | last | section |
| 1        | Jon   | A    | y3      |
| 2        | Bob   | Z    | t6      |
| 3        | Pat   | G    | h4      |
| 4        | Ron   | Z    | u3      |
| 5        | Sam   | D    | y3      |
| 6        | Sam   | D    | u3      |
| 7        | Pam   | F    | h4      |

我想隔离所有重复的名称,尽管有其他列,如下所示:

| personid | first | last | section |
| 5        | Sam   | D    | y3      |
| 6        | Sam   | D    | u3      |

这是我想到的,但我无法让它工作:

SELECT personid, last, first, section FROM   d 01 WHERE  EXISTS 
   (SELECT * FROM d 02 WHERE  02.last = 01.last AND 02.first = 01.first )

您必须检查 2 行是否具有不同的 ID:

SELECT d1.personid, d1.last, d1.first, d1.section 
FROM d d1 WHERE EXISTS (
  SELECT * 
  FROM d d2 
  WHERE d1.personid <> d2.personid AND d2.last = d1.last AND d2.first = d1.first 
)

始终使用 table 的 name/alias 限定列名并且不要使用数字作为别名,除非它们包含在反引号或方括号中。
demo.
结果:

| personid | last | first | section |
| -------- | ---- | ----- | ------- |
| 5        | D    | Sam   | y3      |
| 6        | D    | Sam   | u3      |

您可以进行 window 计数并按此过滤:

select personid, first, last, section
from (
    select t.*, count(*) over(partition by first, last) cnt
    from mytable t
) t
where cnt > 1

产生与另一个已接受答案相同结果的另一种方法:

SELECT personid,
   A.firstName,
   A.lastName,
   section
FROM personTable as A
INNER JOIN (
    SELECT  
        firstName,
        lastName,
        CASE 
            WHEN COUNT(*)>1 THEN 'Yes'
            ELSE 'Null' , AS UseName
    FROM 
        personTable
    WHERE UseName='Yes') as B 
 ON A.firstName=B.firstName AND A.lastName=B.lastName

此解决方案对自身进行子查询。由于它是一个内部连接,它只会将连接到子查询的值拉出来。由于我过滤掉了计数小于 2 的所有内容,因此只有重复项会匹配。