Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 出于某种原因,查询将返回除2条记录以外的所有记录,即使它在技术上符合条件_Sql_Sql Server - Fatal编程技术网

Sql 出于某种原因,查询将返回除2条记录以外的所有记录,即使它在技术上符合条件

Sql 出于某种原因,查询将返回除2条记录以外的所有记录,即使它在技术上符合条件,sql,sql-server,Sql,Sql Server,今天我在我的一个应用程序中发现了一些奇怪的东西——实际上有人向我指出了。我有一个包含大量客户机的表,让用户运行一个报告来查找潜在的重复项。这是一个初步的重复搜索,所以我选择了名字和姓氏的前几个字符 让我们想象一下,我有一个客户列表: tblA ClientID FName LName 1 Carol Villa 2 Carol Villa 3 Gain

今天我在我的一个应用程序中发现了一些奇怪的东西——实际上有人向我指出了。我有一个包含大量客户机的表,让用户运行一个报告来查找潜在的重复项。这是一个初步的重复搜索,所以我选择了名字和姓氏的前几个字符

让我们想象一下,我有一个客户列表:

tblA
ClientID        FName         LName
1               Carol         Villa
2               Carol         Villa
3               Gainy         Brimes
4               Gainy         Brimes
这是我使用的查询:

 select ClientID, FName, LName 
 from (select t.*,  count(*) over (partition by (substring(FName,0,4)), (substring(LName,0,4)), dob) as cnt  from tblClients t   ) t  
 where cnt > 1  
 order by  FName, LName
如果对此表运行此查询,则只会得到以下记录:

ClientID      FName        LName
1             Carol        Villa
2             Carol        Villa

它没有向我展示盖尼·布里姆斯,有什么原因吗?

答案已经被库什自己发现了。
由于DOB用于窗口函数的分区,因此不匹配的DOB可以忽略一些“可疑”重复项

但这里有一个小测试脚本来演示这种效果:

declare @tblClients table (ClientID int, FName varchar(30), LName varchar(30), dob int);
insert into @tblClients (ClientID, FName, LName, dob) values
 (1,'Carol','Villa',100)
,(2,'Carina','Vilpo',100)
,(3,'Garcy','Brimes',100)
,(4,'Garry','Bricks',200)
;

select ClientID, FName, LName
, dob, cnt, rn
, CASE WHEN cnt > 1 THEN 'Has Partial Dups' ELSE 'No Partials Dups' END as ThereBeDups
from 
(
 select ClientID, FName, LName, dob,  
 count(*) over (partition by dob, substring(FName,1,3), substring(LName,1,3)) as cnt,
 row_number() over (partition by dob, substring(FName,1,3), substring(LName,1,2) order by ClientID desc) as rn
 from @tblClients
) t
--where cnt > 1
order by  FName, LName;
结果:

ClientID    FName   LName   dob cnt rn  ThereBeDups
--------    -----   -----   --- --- --  ----------------
2           Carina  Vilpo   100 2   1   Has Partial Dups
1           Carol   Villa   100 2   2   Has Partial Dups
3           Garcy   Brimes  100 1   1   No Partial Dups
4           Garry   Bricks  200 1   1   No Partial Dups

你的数据库管理系统是什么?如果是sql server,
子字符串
不像C#那样基于0,而是1。换句话说,
子字符串(FName,0,4)
子字符串(FName,1,3)
相同。但这并不能解释您的问题。您的
dob
列在样本数据中的什么位置?SSMS 2012@HoneyBadger@YogeshSharma这就是为什么!DOB对于两个客户端都不匹配,这就是为什么它没有被提取。您应该从该查询中获取所有四条记录。