我正在使用SQL-Server 2000,并且正在尝试查找具有特定条件的重复项。有人在这里帮助了我更好的重复部分,但是,我无法弄清楚如何进一步过滤重复的情况。
我需要将“where”语句移动到子查询,以便我仅获得承包商重复的名称,而不是所有重复的名称,这是这个代码发生的事情(代码首先找到所有重复项,然后过滤掉承包商,我希望它能做相反的事情)。问题是我将它混合成一个聚合语句,它给了我一个错误。我试图在子查询中放入另一个子查询,但它仍然给了我一个错误。
任何帮助表示赞赏。这是一个更简单(我正在学习)的代码版本:
SELECT DISTINCT(c1.contactid) as 'ContactID', c1.lastname as 'Last Name', c1.firstname as 'First Name'
FROM contacts c1 INNER JOIN (SELECT lastname, firstname FROM contacts group by lastname, firstname
HAVING count(*)>1)
dups on c1.lastname=dups.lastname and c1.firstname=dups.firstname
WHERE (c1.contractor=1)
答案 0 :(得分:1)
对于您给出的示例代码,将where子句放在“from contacts”和“group by lastname,firstname”之间应该是技巧。
答案 1 :(得分:1)
我认为这就是你想要的:
SELECT
contact.ContactId,
contact.FirstName,
contact.LastName
FROM contacts as contact
INNER JOIN
(
SELECT ContactID FROM contacts GROUP BY FirstName, LastName HAVING Count(*) > 1
) AS Dups
ON Dups.ContactId = contact.ContactId
WHERE
contact.isContractor = 1
你非常接近。这将为您提供具有匹配记录的每个单独记录的列表,该记录具有相同的名字和姓氏。希望这有帮助
答案 2 :(得分:0)
将where子句移动到子查询。首先填写所有非承包商,然后将其余部分分组。
SELECT DISTINCT
c1.ContactId
,c1.lastname as 'Last Name'
,c1.firstname as 'First Name'
from contacts c1
inner join (select lastname, firstname
from contacts
where c1.contractor = 1
group by lastname, firstname
having count(*) > 1) dups
on c1.lastname = dups.lastname
and c1.firstname = dups.firstname
哦,除非有充分理由,否则你真的不希望在列别名中包含嵌入空格(“姓氏”,“名字”)。
答案 3 :(得分:0)
Select C.contactid As ContactID
, C.LastName As [Last Name]
, C.FirstName As [First Name]
From contacts C
Inner Join (
Select C1.LastName, C1.FirstName
From contacts As C1
Where C1.contractor = 1
Group By C1.LastName, C1.FirstName
Having Count(*) > 1
) As dups
On C.LastName = dups.LastName
And C.FirstName = dups.FirstName
Where C.contractor = 1
在子查询和外部查询中,您将需要contractor = 1
上的过滤器。否则,您可能会返回碰巧与承包商同名并且重复的人。
此外,如果ContactId是Contacts表的主键,则不需要Distinct
关键字。