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