Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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 试图在地址仅在一个字段和某个数字上不同的记录中查找重复_Sql_Duplication - Fatal编程技术网

Sql 试图在地址仅在一个字段和某个数字上不同的记录中查找重复

Sql 试图在地址仅在一个字段和某个数字上不同的记录中查找重复,sql,duplication,Sql,Duplication,我有一个包含NAP字段的列表,我想在其中找到重复项——特别是除了门牌号(在2或3位以内)之外,所有内容都是相同的 我的桌子看起来像这样: Name Housenumber Streetname Streettype City State Zip 1 36 Smith St Norwalk CT 6851 2 38 Smith St Norwalk CT

我有一个包含NAP字段的列表,我想在其中找到重复项——特别是除了门牌号(在2或3位以内)之外,所有内容都是相同的

我的桌子看起来像这样:

Name Housenumber Streetname   Streettype City       State  Zip
1    36          Smith        St         Norwalk    CT     6851
2    38          Smith        St         Norwalk    CT     6851
3     1          Kennedy      Ave        Campbell   CA     95008
4     4          Kennedy      Ave        Campbell   CA     95008
我想知道如何建立一个qry来查找这样的记录

我试过一些方法,但不知道怎么做-任何帮助都将不胜感激


谢谢

您是否希望找到显示这些行数量的内容

SELECT 
    StreenName,
    City,
    State,
    Zip,
    COUNT(*)
FROM YourTable
group by StreenName, City, State, Zip
HAVING COUNT(*) >1
或者尝试查找所有具有相同街道、城市、州和邮政编码的行

SELECT 
    A.HouseNumber,
    A.StreetName,
    A.City,
    A.State,
    A.Zip
FROM YourTable as A
INNER JOIN YourTable as B
    ON A.StreetName = B.StreetName
    AND A.City = B.City
    AND A.State = B.State
    AND A.Zip = B.Zip
    AND A.HouseNumber <> B.HouseNumber
选择
A.门牌号,
A.街道名称,
A.城市,
A.国家,
A.拉链
从你的桌子上
将表内部连接为B
在A.StreetName=B.StreetName上
A.城市=B.城市
A.状态=B.状态
A.Zip=B.Zip
A.门牌号B.门牌号

这里有一种方法。您需要一个表的唯一ID来运行此操作,因为您不希望选择完全相同的人(如果他们是唯一的人)。这将在至少有一个重复的地方吐出所有结果

编辑:Woops,刚刚在评论中意识到它说varchar代表街道号码…嗯。所以你可以在上面做个演员。OP从来没有提到过varchar中的门牌号,也没有提到原始帖子中的字母和数字。至于“街道号码”字段中的字母,我在过去2年里一直是第三方运输提供商,但我从未见过这样的供应商;除了apt,它将是一个差异字段。很可能有人出于其他原因(领先0)或没有原因将varchar放在那里。当然可以,但是如果没有OP的响应,就无法知道字段中的内容。要运行cast To int,除了每个实例之外都是一样的:cast(mt.HouseNumber as int)


不知道如何运行-3+3,如果有信件的发票…除非你知道他们在哪里,你可以简单地把他们剪掉然后再投。

什么是门牌号的数据类型?另外,如果忽略2或3位以内的部分,您知道怎么做吗?2或3位,您的意思是“36”将匹配“34(33)”和“38(39)”之间的值或“1”和(9)999之间的值吗?@DanBracuk它是varchar(10),不,我不知道如何忽略相隔2或3位的值。@lc。我的意思是36将匹配33/34和38/39之间的值。@Zane答案中的第二个查询显示了如何忽略相隔2或3位的值。考虑到门牌号有时包含字母,他的回答可能会非常好。
 select *
 from MyTable mt
 where exists (select 1
               from MyTable mt2
               where mt.name = mt2.name
               and mt.street = mt2.street
               and mt.state = mt2.state
               and mt.city = mt2.city
               and mt2.HouseNumber between (mt.HouseNumber -3) and (mt.HouseNumber +3)
               and mt.UID != mt2.UID
               )
 order by mt.state, mt.city, mt.street
 ;