我在尝试从我的2005 MS-SQL数据库中选择记录时遇到了问题(我还是SQL的新手,但我已经学习并使用了w3schools的基本命令)。理论上,我的所有制造商记录都应该是唯一的。至少这就是我第一次将大量数据转储到其中时的意图。不幸的是,事实并非如此,现在我需要解决它!这是我的情景:
Table name = ItemCatalog
Relevant columns = Partnumber,Manufacturer,Category
当我做SELECT DISTINCT Manufacturer FROM ItemCatalog
时,这个小问题就出现了:
Cables2Go
CablesToGo
电缆要去
CableToGo公司
CablesToGo Inc
所有这5个都表现得与众不同。不能错过我的SELECT语句来返回它,但从我的人类角度来看,它们都是同一个制造商!我看到的一种方法是执行UPDATE命令并修复所有显示的排列,但我有很多制造商,这将非常耗时。
当我打入SELECT语句时,有没有办法,我可以找到制造商名称(或任何字段)的所有可能的排列?我尝试了LIKE运算符,所以我的语句会读取
SELECT Manufacturer FROM ItemCatalog WHERE Manufacturer LIKE '%CablesToGo%'
但这并没有像我希望的那样好。这是令人讨厌的一点,我正在整理的其他程序绝对要求我只要求一个制造商名称,而不是所有5种变体。也许我在这里谈论圈子,但是在一个声明中有一种简单的方法可以让我找到类似的字符串吗?
答案 0 :(得分:3)
如果您正在进行一些数据挖掘,您还可以尝试SQL Server中的SOUNDEX
和DIFFERENCE
函数。
虽然他们都已经过时了(他们不能很好地处理外国人的角色),但他们可以为你带来一些有趣的结果:
SELECT * FROM ItemCatalog WHERE SOUNDEX(Manufacturer) = SOUNDEX('Cables To Go');
和
SELECT * FROM ItemCatalog WHERE DIFFERENCE(Name, 'Cables To Go') >= 3;
数字3表示可能相似(0表示不相似,4表示非常相似)
互联网上有一些更好的SOUNDEX
功能。有关示例,请参阅Tek-Tips。
以下是SQL Team的另一个例子。
答案 1 :(得分:0)
我知道其他人正在建议查询修复 - 我想我会详细说明我对踢的长期修复。
您可以创建另一个表格,将每个变体与单个制造商实体相关联。如果我在工作中遇到这种情况(我有),我会被诱惑解决它。
使用主键,名称等创建制造商的表。
创建一个带别名的表 - 只有当您看到没有制造商ID的数据(如导入文件)时才需要这些。
修改ItemCatalog,使其引用manufacturer表中的主键(即ManufacturerID外键)。
将数据导入ItemCatalog时,请根据与别名表的匹配项分配ManufacturerID外键。如果您的名称与2个以上的记录匹配,那么您将其标记为手动审核,或者您尝试匹配的不仅仅是制造商名称。
答案 2 :(得分:0)
'Cable%Go%'可能适用于这种情况,但如果您对其他字符串有其他变体,则可能需要进行大量的手动数据清理。
答案 3 :(得分:0)
标准SQL有一个SIMILAR语句,它比LIKE更强大。
但是,您可以使用LIKE获得良好效果:
Manufacturer LIKE 'Cable%Go%'
这将适用于此特定情况,查找列出的所有变体。然而,它也会找到'有线电视Gorgons',你可能不需要它们。您的版本也会找到“我们讨厌有Ferocity公司的电缆”,您可能也不想要它。
然而,数据清理是一个主要问题,有些公司以提供数据清理为生。您经常最终制作一个词典或术语词库(此处为公司名称),将所有遇到的变体映射到规范形式。问题是,有时您会发现相同的变体拼写用于两个单独的规范形式。例如,一对明亮的火花可能都决定使用'C2G'作为缩写,但是一个用于'Cables To Go Inc'而另一个用于'Computers To Gamers Inc'。您必须使用其他一些信息来确定“C2G”的特定实例是否代表“电缆”或“计算机”。
答案 4 :(得分:0)
我建议你使用对象关系映射工具将你的表映射到对象并在那里添加过滤逻辑。
答案 5 :(得分:0)
您可以选择将通配符搜索放到'Cables%Go%'
之类。这在短期内可能会很好,但是使用这种方法,您可能会遇到比您想要的更多制造商匹配的风险(例如,有线电视等)。
您还可以组合一个映射表,该表将把Cables To Go的所有变体放入一个组中,您的应用可以查询并规范化您的ItemCatalog查询。
您的另一个选择是引入制造商表。然后,您的ItemCatalog表将具有此表的外键,并且仅允许制造商表中的制造商。这需要对ItemCatalog表进行一些清理以使其正常工作,假设您希望所有Cables Go的变体都相同。