我认为我有一个通常很容易的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子句中使用多个字段,但我不确定还有什么可以尝试。有什么想法吗?
答案 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
编辑:按条款删除订单