SQL问题 - 重复名称,列出所有字段

时间:2010-12-29 16:58:46

标签: sql sql-server-2005

我认为我有一个通常很容易的SQL问题,我需要帮助。我有一个我需要使用的表,其中包含以下字段:pmsid,ssn,lname,fname,rc和budcode。其中一些领域是显而易见的,其他领域对我的问题并不重要。

我需要列出此集合中具有重复的名字和姓氏的记录。因此,如果Joe Blow出现两次,我希望他的名字出现在这个名单上。 我还需要显示记录中的其他字段。到目前为止很简单?

我创建了以下SQL语句,它正确地列出了相关记录的名字和姓氏。如果我包括所有字段,我根本就没有记录。到目前为止,这是有效的:

  

SELECT lname,fname FROM [Employee]
  在哪里lname!=''和fname!=''
  GROUP BY lname,fname
  有计数(*)> 1

然后我尝试执行以下操作以列出其他字段,但显然我收到错误:

  

SELECT * FROM [Employee]
  在

中的lname,fname
(SELECT lname, fname FROM [Employee]  
WHERE lname != ' 'AND fname != ' '  
GROUP BY lname, fname  
HAVING COUNT(lname) > 1 and COUNT(fname) > 1)  
  

ORDER BY lname,fname

我知道我不能在WHERE子句中使用多个字段,但我不确定还有什么可以尝试。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

我认为你原来的解决方案并不是那么遥远,我只是尝试将名称附加到一个字段而不是两个字段,例如:

SELECT * FROM [Employee]
WHERE lname + ', ' + fname in 
(SELECT lname + ', ' + fname as fullname FROM [Employee]
WHERE lname != ' ' AND fname != ' '
GROUP BY lname + ', ' + fname
HAVING COUNT(*) > 1)

还有许多其他方法也可以使用,已经发布了一对夫妇。

答案 1 :(得分:2)

每行是否有身份字段或其他唯一标识符?如果是这样,你可以自我加入:

SELECT e.*
FROM Employee as E
INNER JOIN Employee as E2 
ON e.fname = e2.fname and e.lname = e2.lname
WHERE e.id <> e2.id

答案 2 :(得分:1)

您可以使用SUM聚合函数来实现此目的: 示例查询:

SELECT *
  FROM (
        SELECT  pmsid, 
                ssn, 
                lname, 
                fname, 
                rc, 
                budcode, 
                SUM(1) OVER(PARTITION BY lname, fname) tsum
          FROM [Employee] a
       ) b
 WHERE  tsum > 1

编辑:按条款删除订单