2013-10-17 13 views
6

Ich bin relativ neu zu SQL so Appologien, wenn diese Fragen seltsam klingt.Best Practice für Nachschlagetabellen In SQL

Ich komme immer wieder über das Problem der schlechten Daten. Als ein Beispiel könnte London als LON, London UK, London England usw. gespeichert werden. Vor der Verwendung von SQL hatte ich viele Excel-Nachschlagetabellen, in denen in der ersten Spalte das Original dann die 2n die korrigierte Version hätte. Als Beispiel:

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

Gibt es eine einfache Möglichkeit, dies in SQL zu tun, versuche ich momentan Lookup-Tabellen zu erstellen und dann schließt sich Gebrauch. Dies wird schwierig, da ich nicht immer Korrekturen für jede Instanz habe. In einigen Szenarien (die meisten) haben meine Nachschlagetabellen weniger Elemente als das, womit ich sie verknüpfe.

Ich habe mich selbst über gespeicherte Prozeduren gelehrt und ich fragte mich, ob dies passen könnte, was ich brauche. Problem ist, dass meine Suche nach dem Thema Nachschlagetabellen leer ausgeht.

Alle Ratschläge oder Hinweise würden dankbar erhalten. Auch wenn es gerade so ist, kann das nicht gemacht werden.

Danke wie immer für Sie Hilfe und Appos für die lange Post.

+0

In Excel, wie Sie die zweite Spalte aktualisiert wurde. Haben Sie Aufzeichnungen gemacht oder hatten Sie etwas Automatisiertes? –

+0

Hallo Dan, es war eine Kombination von Augapfel die Daten und die Funktion zum Suchen und Ersetzen. Danke Chris – chris1982

+0

Sie können das gleiche mit Datenbanken tun. Sie können eine Select-Abfrage ausführen, um nach den zu untersuchenden Datensätzen zu suchen und sie zu aktualisieren, um sie zu aktualisieren. Sie können Access auch mit verknüpften Tabellen verwenden, um die Aktualisierungen zu vereinfachen. Ich schlage vor, dass Sie Ihre Aufzeichnungen zeitlich so stempeln, dass Sie nicht immer den ganzen Tisch betrachten müssen. –

Antwort

1

Sie keine der anderen Dinge zu tun haben, nur das Original zurück, wenn Sie nicht über eine Übersetzung für sie.

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

Und anstelle der "großen" case/when/else/end, könnten Sie einfach verwenden: 'coalesce (t2.name_1, t1.lookupfield) als name_1' –

0

Die Quintessenz ... schlechte Daten sind schlechte Daten und es kostet viel Arbeit, entweder schlechte Daten zu verwenden oder schlechte Daten oder beides zu bereinigen.

UPDATE Nach Klärung

Ihren eigenen ETL Bau (Extract, Transform, Load) Prozess all Varianten eingehende Daten zu verarbeiten. Ihr ETL-Prozess wird höchstwahrscheinlich mit jedem neuen Datenstapel geändert, den Sie erhalten, weil Sie nach neuen "Bad Data" -Varianten suchen müssen.

Importieren der Daten in ein ALL VARCHAR Tabelle
Führen Sie den ETL-Prozess

  • Gute Daten realen Datentabellen
  • Bad Datentabelle geht in eine Ausnahme

Repeat
geht in ETL-Prozess ändern
ETL-Prozess ausführen
Bis Nein M Erz Ausnahmen

- End-Update

Wenn Sie LEFT JOIN Sie können die fehlenden Werte relativ leicht zu identifizieren.

SELECT 
t1.FirstName, 
t1.LookupField, 
t2.Name_1 
FROM People as t1 
LEFT INNER JOIN TableLookupCities as t2 
ON t1.LookupField = t2.Name 

Überall t2.Name_1 eine NULL zurück Sie wissen Sie, dass „LookupField“, um Ihre Lookup-Tabelle hinzufügen müssen. Hier ist ein gutes Buch für das Lernen Datenbank-Design 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 
+0

Kann ich dies anpassen, um den ursprünglichen Namen zurückzugeben, wenn kein Beispiel dafür in meiner Nachschlagetabelle vorhanden ist? Grund Ich frage, gibt es 180k + Transaktionen, von denen ich nicht alle korrigieren muss, einige können so belassen werden wie es ist. Danke Chris – chris1982

+0

Fehlende Werte sind nicht das einzige Problem. Sie müssen sich auch mit sich ändernden Werten auseinandersetzen, etwa wenn jemand von London England nach Paris Frankreich zieht. –

+0

@ chris1982 - Was ist der Grund für eine Lookup-Tabelle? –

0

Wie oben erwähnt, schlechte Daten ist es eigenes Problem. Die Datenbereinigung ist eine Branche für sich. Sie haben also eine große Auswahl an Möglichkeiten für diese Art von Problem, von den einfachen und unkomplizierten bis hin zu den aufwendigen Versuchen, alles auf den Kopf zu stellen. Was "am besten" ist, hängt von Ihrer Situation und Ihren Bedürfnissen ab.

Sicherlich ist es möglich, diese Nachschlagetabelle zu erweitern, um einer wachsenden Anzahl von Standardfehlern/-variationen gerecht zu werden. Wenn dies jedoch ein konstanter Informationsfluss ist, entsteht ein Wartungsaufwand. Dies kann gut für Ihre Bedürfnisse sein, also scheuen Sie sich nicht davor, nur weil es schickere Alternativen gibt.

Es ist durchaus üblich, die Zuverlässigkeit der manuellen menschlichen Intervention für die Skalierbarkeit von automatisierten Ansätzen zu handeln; Dies ist viel einfacher zu pflegen und zu wachsen, aber (je nach Art Ihres Problems) kann Fehler machen.

Bsp 1. Verwenden Sie einen musterbasierten Ansatz (Contains, LIKE, RegEx), um etwas zu finden, das angemessen erscheint. Das kann in manchen Situationen gut sein, zum Beispiel wenn Name_1 eine statische, gut verstandene Liste ist, so dass Sie sicherstellen können, dass die Ergebnisse normalerweise gut genug sind. + einfach zu installieren/verstehen + flexibler als vollständige Liste - dauert noch ein wenig Wartung - hoffnungslos in komplexen/schlecht Situationen verstanden

Eg 2. In dem allgemeineren Fall, können Sie die Textsuche verwenden Funktionen, die von der Datenbank angeboten werden, um zu "punkten", wie gut ein Wert gegen den anderen passt, und wählen Sie die beste passende Option aus. Auch dies ist nicht narrensicher oder sicher in allen Kontexten, und es ist ein bisschen mehr Arbeit zu Setup, aber es ist viel robuster. Dies ist etwas leistungsintensiver, daher sind die Größe der betroffenen Datasets, die Zeitpläne, an denen Sie arbeiten, und die verfügbare Infrastruktur ebenfalls zu berücksichtigen. + recht gute Erfolgsraten - langsamer Setup - größere Leistung Gemeinkosten

zB 3. Eine andere Möglichkeit, etwas mehr domänenspezifische wäre. In diesem Fall handelt es sich um räumliche Daten. Daher können Sie einen Geocodierungsdienst eines Drittanbieters als Validierungsmethode verwenden. + hohe Erfolgsquote + fähig ist mit großen Wertebereichen, zu tun - wird eventuell zusätzlich Kosten - härteste/langsamste Setup

+0

Danke dafür, interessante Lektüre! Ich habe die Daten zur Hand und die Ressource, um neue Informationen zu überprüfen. Ich denke jetzt über den besten Weg nach, es zu korrigieren. Danke noch einmal. – chris1982

1

Sie auf die Lookup-Tabelle beitreten können und preferrable Verwendung der dort angegebenen Wert. Wenn nicht gefunden, verwenden Sie das Original:

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 

Stellen Sie sicher, dass für jeden Namen ist es höchstens ein Spiel in TableLookupCities, oder aber die beitreten werden mehrere Ergebnisse produzieren. Erstellen Sie einen eindeutigen Index auf TableLookupCities.Name:

CREATE UNIQUE (CLUSTERED) INDEX djgndkg ON TableLookupCities (Name) INCLUDE (Name_1)