繁体   English   中英

SQL 中查找表的最佳实践

[英]Best Practice For Lookup Tables In SQL

我对 SQL 相当陌生,所以如果这个问题听起来很奇怪,我深表歉意。

我不断遇到数据不佳的问题。 例如,伦敦可以存储为 LON、英国伦敦、英国伦敦等。 在使用 SQL 之前,我有很多 Excel 查找表,在第一列中我将拥有原始数据,在第二个帮助列中我将进行更正版本。 例如:

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

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

我一直在自学存储过程,我想知道这是否可以解决问题。 问题是我对查找表主题的搜索是空的。

任何建议或指点将不胜感激,即使只是说这是不可能的。

一如既往地感谢您的帮助,并为这篇长篇文章致歉。

您可以加入查找表并最好使用那里给出的值。 如果没有找到,请使用原件:

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)

您不必做任何其他事情,如果您没有翻译,只需返回原件即可。

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

底线......坏数据就是坏数据,使用坏数据或清理坏数据或两者兼而有之需要大量的工作。

澄清后更新

构建您自己的 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

任何地方 t2.Name_1 返回一个 NULL 您知道您需要将该“LookupField”添加到您的查找表中。 这是一本学习数据库设计的好书,适合普通人的数据库设计

-- 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

如上所述,坏数据是它自己的问题。 数据清理本身就是一个行业,因此对于此类问题,您有多种选择,从简单明了,到精心尝试解决所有花里胡哨的问题。 什么是“最佳”取决于您的情况和需求。

当然,可以继续扩展此查找表以适应越来越多的标准错误/变体,但如果这是一个持续的信息流,则会产生维护开销。 这可能足以满足您的需求,所以不要因为有更好的选择而回避它。

用人工干预的可靠性换取自动化方法的可扩展性是很常见的; 这更容易维护和发展,但(取决于您的问题的性质)可能会出错。

例如 1. 使用基于模式的方法(Contains、LIKE、RegEx)来找到看起来合理的东西。 在某些情况下这可能很好,例如当 Name_1 是一个静态的、易于理解的列表时,因此您可以确保结果通常足够好。 + 易于设置/理解 + 比完整列表更灵活 - 仍然需要一些维护 - 在复杂/难以理解的情况下毫无希望

例如 2. 在更一般的情况下,您可以使用数据库提供的文本搜索功能来“评分”一个值与另一个值的匹配程度,并选择最佳匹配选项。 同样,这在所有情况下都不是万无一失或安全的,设置起来需要做更多的工作,但它更强大。 这对性能的要求更高,因此所涉及的数据集的大小、您的工作时间尺度以及可用的基础设施也是需要考虑的因素。 + 相当好的成功率 - 较慢的设置 - 更大的性能开销

例如 3. 另一种选择是更具体的领域。 在这种情况下,它是空间数据,因此您可以使用第 3 方地理编码服务作为验证手段。 + 高成功率 + 能够处理大范围的值, - 可能会产生额外的成本 - 最难/最慢的设置

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM