Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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_Sql Server_Sql Server 2008_Duplicates - Fatal编程技术网

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

SQL-从一个表中选择具有类似值且前缀不同的所有行,sql,sql-server,sql-server-2008,duplicates,Sql,Sql Server,Sql Server 2008,Duplicates,我有一张大约有一百万行的桌子。 在fileID列中出现了一些意外的重复。 此列可以将7位或8位数字存储为字符串 我需要搜索所有7位数的值,这些值有一个对应的条目,该条目是相同的7位数,前缀为“0”(零) 因此,虽然fileID中应该只有一行值为“1234567”,但现在有一行值为“01234567”的新行输入错误。我相信大约有10000行受到影响,需要删除不正确的条目 如何编写SQL查询以仅选择具有相应的0前缀行的行,并在结果中返回这两行 澄清编辑: 某些有效数据已输入到文件ID不正确的记录中,

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

我需要搜索所有7位数的值,这些值有一个对应的条目,该条目是相同的7位数,前缀为“0”(零)

因此,虽然fileID中应该只有一行值为“1234567”,但现在有一行值为“01234567”的新行输入错误。我相信大约有10000行受到影响,需要删除不正确的条目

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

澄清编辑: 某些有效数据已输入到文件ID不正确的记录中,因此理想情况下,我需要的输出应该是一个具有7位文件ID的行,后跟任何具有前导为“0”的8位文件ID的对应行

fileID other1 other2
1234567 xxxxxx xxxxxx
01234567 xxxxxx xxxxxx
123456XXXXXX xxxxxx

01234566 xxxxxx xxxxxx

您可以按最后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

未经测试

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

根据您在问题中的描述,我认为像“0%”这样的
语句就可以了。然而,正如你所说,你可能会删除太多的记录,所以我的另一个建议是检查长度

由于您提到文件ID应仅为7位,因此如果长度超过7位,您可以检查条件:

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

这将产生所需的输出:

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) 

您是否有我们可以参考的已开始的查询?另外,您可以在问题中包含表结构吗?为什么不能像“0%”那样使用
语句?作为第一个字符的
0
是无效值还是允许的?@Ronan Muldoon我已经更新了我的答案,以所需格式显示输出。您不是想按正确的方式分组(fileid,1)吗?您还可以选择fileid吗?@DavidG Yep,在修改我的源查询时错误地删除了它,但我认为您不能选择fileid,因为它不在组中。在我的机器上工作。。。FileID是右边(…)的别名,尽管我会尝试添加
HAVING COUNT(*)>1
以仅显示重复项。如果任何行包含非数字值,这将出错。是的,仅当ID是数字时才有效,但问题明确表示它们是存储为的数字string@Jayvee我试过这个,但有些fileid值最多为16位,这导致int列溢出:“varchar值'615744815568'的转换溢出了int列。超过了最大整数值。”(我没有提到它们可能更长,因为我只关心7位和8位的值。对不起!)@Ronan Muldoon,然后您可以将其转换为数字(18,0)或bigint,这应该会起作用。最好的做法是添加解释,说明为什么您的答案是一个好的解决方案,而不仅仅是删除代码。对不起:$(顺便说一句,我更新了查询)我所做的只是将tablt连接到它本身,以获取所有在我使用的文件ID中具有前缀“0”的重复行,这样我就不会两次获得相同的行