我有一张约有一百万行的桌子。 在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
答案 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