SQL中查找表的最佳实践

时间:2013-10-17 11:59:18

标签: sql sql-server-2008-r2

如果这个问题听起来很奇怪,我对SQL很新,所以很有用。

我一直在讨论数据不佳的问题。作为一个例子,伦敦可以存储为LON,伦敦英国,伦敦英国等。在使用SQL之前,我有很多Excel查找表,在第一列中我将拥有原始版本,然后是2n更正版本。举个例子:

Name             Name_1
London, UK       London
Lon              London
LON              London
London           London
London, England  London
LND              London

在SQL中是否有直接的方法,我目前正在尝试创建查找表,然后使用连接。这变得很棘手,因为我并不总是对每个实例都进行更正,因此在某些情况下(大多数情况下),我的查找表比我加入它们的项目更少。

我一直在教自己存储过程,我想知道这是否符合我的需要。麻烦是我搜索查找表的主题是空的。

将非常感激地收到任何建议或指示。即使只是这样也无法做到。

感谢您一直为您提供长篇文章的帮助和建议。

4 个答案:

答案 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.另一种选择是更具领域性的。在这种情况下,它是空间数据,因此您可以使用第三方地理编码服务作为验证手段。 +成功率高 +能够处理大范围的价值观, - 可能会产生额外费用 - 最难/最慢的设置