0

我在尝试从我的 2005 MS-SQL 数据库中选择记录时遇到了问题(我对 SQL 还是很陌生,但我已经从 w3schools 学习并使用了基本命令)。理论上,我所有的制造商记录都应该是唯一的。至少当我第一次将大量数据转储到其中时,我打算这样做。不幸的是,事实并非如此,现在我需要修复它!这是我的场景:

Table name = ItemCatalog
Relevant columns = Partnumber,Manufacturer,Category

当我做了一个SELECT DISTINCT Manufacturer FROM ItemCatalog小问题时,出现了:

Cables2Go
CablesToGo
Cables To Go
CableToGo Inc
CablesToGo Inc

所有 5 个都显示为不同的,它们是。不能因为返回它而责备我的 SELECT 语句,但从我人类的角度来看,它们都是同一制造商!我认为可行的一种方法是执行 UPDATE 命令并修复出现的所有排列,但我有很多制造商,这将非常耗时。

当我输入 SELECT 语句时,有没有办法可以找到制造商名称(或任何字段)的所有可能排列?我尝试了 LIKE 运算符,所以我的声明将显示为

SELECT Manufacturer FROM ItemCatalog WHERE Manufacturer LIKE '%CablesToGo%'

但结果并没有我希望的那么好。这是令人讨厌的一点,我正在组合的另一个程序绝对要求我只要求一个制造商名称,而不是所有 5 个变体。也许我在这里绕圈子说话,但是在一个语句中是否有一种简单的方法可以让我找到类似的字符串?

4

6 回答 6

3

如果你正在做一些数据挖掘,你也可以试试 SQL Server 中的SOUNDEXandDIFFERENCE函数。

虽然它们都过时了(它们不能很好地处理外来字符),但它们可以为您带来一些有趣的结果:

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的另一个示例。

于 2009-09-07T03:15:02.403 回答
0

我知道其他人建议进行查询修复——我想我会详细说明我的长期修复问题。

您可以创建另一个表,将每个变体与单个制造商实体相关联。如果我在工作中遇到这种情况(我曾经遇到过),我会很乐意解决它。

使用主键、名称等创建制造商表。

创建一个带有别名的表 - 只有当您看到没有制造商 ID 的数据(如导入文件)时才需要这些别名。

修改 ItemCatalog,使其引用制造商表中的主键(即 ManufacturerID 外键)。

将数据导入 ItemCatalog 时,根据匹配项将 ManufacturerID 外键分配给别名表。如果您的名称与 2 条以上的记录匹配,那么您将它们标记为人工审核,或者您尝试匹配的不仅仅是制造商名称。

于 2009-09-07T02:51:28.797 回答
0

'Cable%Go%' 可能适用于这种情况,但如果您对其他字符串有其他变体,您可能需要进行大量手动数据清理。

于 2009-09-07T02:52:04.993 回答
0

标准 SQL 有一个 SIMILAR 语句,它比 LIKE 更强大一点。

但是,您可以使用 LIKE 来获得良好的效果:

Manufacturer LIKE 'Cable%Go%'

这将在这种特定情况下工作,找到列出的所有变体。但是,它也会找到“Cable TV Gorgons”,您可能不需要包含它们。您的版本还会找到“We Hate CablesToGo With Ferocity Inc”,您可能也不想要。

然而,数据清洗是一个主要问题,有些公司以提供数据清洗为生。您通常最终会制作一个字典或术语词典(此处为公司名称),将遇到的所有变体映射到规范形式。问题是有时您会发现相同的变体拼写用于两种不同的规范形式。例如,一对明亮的火花可能都决定使用“C2G”作为缩写,但其中一个将其用于“Cables To Go Inc”,另一个将其用于“Computers To Gamers Inc”。您必须使用一些其他信息来确定“C2G”的特定实例是指“电缆”还是“计算机”。

于 2009-09-07T02:52:58.580 回答
0

我建议您使用对象关系映射工具将您的表映射到对象并在那里添加过滤逻辑。

于 2009-09-07T02:54:15.470 回答
0

您可以选择的一种选择是将通配符搜索放宽为'Cables%Go%'. 这在短期内可能会很好,但使用这种方法,您可能会遇到比您想要的更多制造商的风险(即,Cables on the Go 等)。

您还可以将映射表放在一起,将 Cables To Go 的所有变体放入一个组中,您的应用程序可以查询并规范化您的 ItemCatalog 查询。

另一个选择是引入制造商表。然后,您的 ItemCatalog 表将具有该表的外键,并且仅允许制造商表中的制造商。这将需要对您的 ItemCatalog 表进行一些清理以使其工作,假设您希望 Cables to Go 的所有变体都相同。

于 2009-09-07T02:58:08.880 回答