SQL - 检查重复的名称/昵称

时间:2011-11-17 16:26:11

标签: sql

我有一个查询,在我的表格中给出了重复的名称。但是,我需要添加昵称检查。我尝试了很多变化,但仍然难倒。以下查询需要12分钟才能运行,所以我取消了它。

WITH TEAM2 as
(
      SELECT ID, LastName, FirstName, Name,
            ROW_NUMBER() OVER (PARTITION BY LastName, FirstName order by LastName, FirstName,ID DESC) RN
      FROM dbo.vw_Users_Details
      WHERE Lastname <> '' 
      AND Firstname <> ''
      AND Not_Dupe_Flag <> 1 
)

SELECT a.ID, a.LastName, a.FirstName
FROM TEAM2 a
where exists (select 1
              from TEAM2 b 
              where (b.FirstName = a.FirstName 
              and b.LastName = a.LastName 
              and b.RN > 1)
              OR
              (b.LastName = a.LastName
              AND EXISTS (SELECT 1 FROM pdNicknames AS c WHERE c.NAME = a.firstname AND c.variation = b.firstname) 
              and b.RN > 1)
              )
order by a.LastName, a.FirstName, a.id

2 个答案:

答案 0 :(得分:0)

您可以使用having子句。

例如:

select b.Branches_ShortName
from kplus..Folders f
inner join kplus..Portfolios p on p.Portfolios_Id = f.Portfolios_Id
inner join kplus..Branches b on b.Branches_Id = p.Branches_Id
group by Branches_ShortName
having count(Branches_ShortName) > 1

这将仅提供具有多个文件夹的分支:)

答案 1 :(得分:0)

好的,您正在尝试查找共享相同名称/昵称的所有用户
我相信以下内容应该有效;

SELECT a.ID, a.LastName, a.FirstName
FROM dbo.vw_Users_Details as a
WHERE a.LastName <> ''
AND a.FirstName <> ''
AND EXISTS (SELECT '1'
            FROM dbo.vw_Users_Details as b
            LEFT JOIN pdNicknames as c
            ON (c.name = b.FirstName 
                AND c.variation = a.FirstName)
            OR (c.name = a.FirstName 
                AND c.variation = b.FirstName)
            WHERE b.ID <> a.ID
            AND b.LastName = a.LastName
            AND (b.FirstName = a.FirstName
                 OR (c.name IS NOT NULL OR c.variation IS NOT NULL)
                )
            )

由于您没有提供足够的信息让我们知道,因此我没有对此声明的执行表现给予任何支持。但是,考虑到您不需要OLAP,它可能会更好;当然,我建议使用各种名称和variation。我离开了Not_Dupe_Flag,因为我对它的使用感到有些困惑(因为你似乎使用'1'作为'假',相对于大多数比较的设置) ;至少,永远不要将'Not'作为布尔变量名称的一部分包含在内 - 它使得推理变得困难(使用Unique_NameDuplicated_Name,其中任何一个都可以立即理解)。


编辑:

如果您需要限制选择,我建议将查询封装在视图中(包括ROW_NUMBER()函数),并查询视图。或者,如果您的RDBMS支持它,请将查询包装在CTE中。多个嵌套的FROM子句就像多个嵌套的if语句 - 令人困惑。能够使用视图或CTE逻辑分离查询的某些部分对于保持理智还有很长的路要走。