如果这个问题听起来很奇怪,我对SQL很新,所以很有用。
我一直在讨论数据不佳的问题。作为一个例子,伦敦可以存储为LON,伦敦英国,伦敦英国等。在使用SQL之前,我有很多Excel查找表,在第一列中我将拥有原始版本,然后是2n更正版本。举个例子:
Name Name_1
London, UK London
Lon London
LON London
London London
London, England London
LND London
在SQL中是否有直接的方法,我目前正在尝试创建查找表,然后使用连接。这变得很棘手,因为我并不总是对每个实例都进行更正,因此在某些情况下(大多数情况下),我的查找表比我加入它们的项目更少。
我一直在教自己存储过程,我想知道这是否符合我的需要。麻烦是我搜索查找表的主题是空的。
将非常感激地收到任何建议或指示。即使只是这样也无法做到。
感谢您一直为您提供长篇文章的帮助和建议。
答案 0 :(得分:1)
您可以加入查找表,并且可以使用其中给出的值。如果找不到,请使用原始文件:
SELECT t1.FirstName, LookupField = ISNULL(t2.Name_1, t1.LookupField)
FROM People as t1
LEFT INNER JOIN TableLookupCities as t2 ON t1.LookupField = t2.Name
请确保,对于每个名称,TableLookupCities
中最多只有一个匹配项,否则该联接将产生多个结果。在TableLookupCities.Name
上创建唯一索引:
CREATE UNIQUE (CLUSTERED) INDEX djgndkg ON TableLookupCities (Name) INCLUDE (Name_1)
答案 1 :(得分:1)
您不必做任何其他事情,如果您没有翻译原文,只需退回原文。
SELECT
t1.FirstName,
t1.LookupField,
case when t2.Name_1 is null
then t1.lookupfield
else t2.name_1 end Name_1
FROM People as t1
LEFT INNER JOIN TableLookupCities as t2
ON t1.LookupField = t2.Name
答案 2 :(得分:0)
底线......糟糕的数据是糟糕的数据,使用不良数据或清理坏数据或两者都需要大量工作。
澄清后更新
构建您自己的ETL(提取,转换,加载)过程以处理所有变体传入数据。您收到的每批新数据很可能会修改您的ETL流程,因为您必须陷入新的“错误数据”变体。
将数据导入ALL VARCHAR表
运行ETL过程
重复
修改ETL流程
运行ETL流程
直到没有更多的例外
- 结束更新
如果使用LEFT JOIN,则可以非常轻松地识别缺失值。
SELECT
t1.FirstName,
t1.LookupField,
t2.Name_1
FROM People as t1
LEFT INNER JOIN TableLookupCities as t2
ON t1.LookupField = t2.Name
Anywhere t2.Name_1返回NULL,您知道需要将“LookupField”添加到查找表中。这是一本学习数据库设计的好书Database Design for Mere Mortals
-- Group By to Find Missing Unique Values
t1.LookupField,
t2.Name_1
FROM People as t1
LEFT INNER JOIN TableLookupCities as t2
ON t1.LookupField = t2.Name
GROUP BY
t1.LookupField,
t2.Name_1
答案 3 :(得分:0)
如上所述,糟糕的数据是它自己的问题。数据清理本身就是一个行业,所以你有很多选择来解决这类问题,从简单直接到精心修复所有的花哨。什么是“最好的”取决于您的情况和需求。
当然可以继续扩展此查找表以满足越来越多的标准错误/变化,但如果这是一个持续不断的信息流,则会产生维护开销。这可能足以满足您的需求,所以不要因为有更好的选择而回避它。
为自动化方法的可扩展性交换手动人工干预的可靠性是很常见的;这更容易维护和增长,但(取决于问题的性质)可能会出错。
例如1.使用基于模式的方法(包含,LIKE,RegEx)来查找看似合理的东西。在某些情况下这可能很好,例如Name_1是一个静态的,易于理解的列表,因此您可以确保结果通常足够好。 +易于设置/理解 +比完整列表更灵活 - 仍然需要一些维护 - 在复杂/难以理解的情况下无望
例如2.在更一般的情况下,您可以使用数据库提供的文本搜索功能来“评分”匹配一个值与另一个值的匹配程度,并选择最佳匹配选项。同样,这在所有情况下都不是万无一失或安全的,而且设置工作要多一些,但它更加强大。这需要更高的性能,因此所涉及的数据集的大小,您的工作时间表以及可用的基础架构也是考虑因素。 +相当不错的成功率 - 设置较慢 - 更大的性能开销
例如3.另一种选择是更具领域性的。在这种情况下,它是空间数据,因此您可以使用第三方地理编码服务作为验证手段。 +成功率高 +能够处理大范围的价值观, - 可能会产生额外费用 - 最难/最慢的设置