我有一个查询,在我的表格中给出了重复的名称。但是,我需要添加昵称检查。我尝试了很多变化,但仍然难倒。以下查询需要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
答案 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_Name
或Duplicated_Name
,其中任何一个都可以立即理解)。
编辑:
如果您需要限制选择,我建议将查询封装在视图中(包括ROW_NUMBER()
函数),并查询视图。或者,如果您的RDBMS支持它,请将查询包装在CTE中。多个嵌套的FROM
子句就像多个嵌套的if
语句 - 令人困惑。能够使用视图或CTE逻辑分离查询的某些部分对于保持理智还有很长的路要走。