SQL - 从一个表中选择具有相似值且具有不同前缀的所有行

时间:2014-07-24 14:53:03

标签: sql sql-server sql-server-2008 duplicates

我有一张约有一百万行的桌子。 在fileID列中出现了一些意外重复。 此列可以将7位或8位数字存储为字符串。

我需要搜索所有7位数字,这些数字的相应条目是相同的七位数字,并带有' 0' (零)为它添加前缀。

所以,虽然应该只有一行有价值' 1234567'在fileID中,现在有一个新行' 01234567'已输入错误。我相信大约有10,000行受到影响,并且需要删除不正确的条目。

如何编写SQL查询以仅选择具有相应0前缀行的行,并返回结果中的两行?

澄清编辑: 一些有效数据已经输入到具有错误fileID的记录中,因此理想情况下我需要的输出具有7位fileID的行,后面是具有8位fileID且具有前导' 0&#39的任何相应行;

fileID other1 other2
1234567 xxxxxx xxxxxxx
01234567 xxxxxx xxxxxxx
1234566 xxxxxx xxxxxxx
01234566 xxxxxx xxxxxxx

4 个答案:

答案 0 :(得分:3)

您可以按照最后7个字符对输出进行分组:

SELECT RIGHT(fileID ,7) AS FileId, count(*) RecordCount
FROM [YOUR_TABLE]
GROUP BY RIGHT(fileID ,7)
HAVING COUNT(*) > 1

这将突出显示基于最后7个字符的重复记录。您可以在临时表中使用此结果,然后对其进行过滤以突出显示以0开头的行。

首先插入临时表:

SELECT RIGHT(fileID ,7) AS FileId, count(*) RecordCount
INTO #temp  
FROM [YOUR_TABLE]
GROUP BY RIGHT(fileID ,7)
HAVING COUNT(*) > 1

然后输出以0开头的8个字符:

SELECT * 
FROM #temp 
WHERE LEFT (FileId,1) = '0' and LEN(FileId) = 8

答案 1 :(得分:0)

根据您在问题中的说明,我认为like '0%'声明会很好。但是,就像你说的那样,你可能会删除太多记录,所以我的其他建议是检查长度。

由于您提到fileID应该只有7位数,所以如果长度超过7位,您可以检查条件:

Select fileID from SomeTable where fileID like '0%' and len(fileID) > 7

答案 2 :(得分:0)

这应该产生所需的输出:

SELECT * FROM table WHERE CAST(fileID AS NUMERIC(18,0))
IN(
SELECT cast(fileID AS NUMERIC(18,0)) FROM table 
group BY CAST(fileID AS NUMERIC(18,0)) HAVING COUNT(*)>1) 

答案 3 :(得分:-1)

<强> UNTESTED

SELECT distinct T1.* FROM TABLE AS T1 
   RIGHT JOIN TABLE T2 
      ON T1.fileID like '%0'+T2.fileID