如何将子查询放在聚合子查询中

时间:2011-05-25 20:27:07

标签: sql-server

我正在使用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)

4 个答案:

答案 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关键字。