2013-10-17 10 views
6

Sono abbastanza nuovo per SQL, quindi mi scuso se questa domanda sembra strana.Best Practice per le tabelle di ricerca in SQL

Continuo a venire attraverso il problema dei dati poveri. Ad esempio, Londra potrebbe essere archiviata come LON, Londra UK, Londra, Inghilterra ecc. Prima di utilizzare SQL avevo molte tabelle di ricerca Excel in cui nella prima colonna avrei l'originale e poi la versione corretta. Per fare un esempio:

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

C'è un modo semplice di fare questo in SQL, Attualmente sto cercando di creare tabelle di ricerca e quindi l'uso si unisce. Questo sta diventando complicato in quanto non sempre ho correzioni per ogni istanza, quindi in alcuni scenari (la maggior parte) le mie tabelle di ricerca hanno meno elementi di quelli a cui li sto unendo.

Ho insegnato a me stesso sulle procedure memorizzate e mi sono chiesto se questo potesse essere adatto a ciò di cui ho bisogno. Il problema è che la mia ricerca sull'argomento delle tabelle di ricerca è vuota.

Qualsiasi consiglio o suggerimento sarebbe stato accolto con gratitudine. Anche se è solo questo non può essere fatto.

Grazie come sempre per il tuo aiuto e le tue apprensioni per il post lungo.

+0

In Excel, come è stata aggiornata la 2a colonna. Hai registrato dei record o hai avuto qualcosa di automatizzato? –

+0

Ciao Dan, era una combinazione di eyeballing dei dati e della funzione Trova e sostituisci. Grazie Chris – chris1982

+0

Puoi fare la stessa cosa con i database. È possibile eseguire una query di selezione per trovare i record da esaminare e aggiornare le query per aggiornarle. Puoi anche utilizzare Access con tabelle collegate per semplificare gli aggiornamenti. Suggerisco di registrare i record in modo da non dover controllare l'intero tavolo ogni volta. –

risposta

1

Non devi fare una qualsiasi delle altre cose, basta tornare originale se non si dispone di una traduzione per esso.

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

E al posto del caso "grande"/quando/else/fine, puoi usare semplicemente: 'coalizione (t2.name_1, t1.lookupfield) come nome_1' –

0

La linea di fondo ... dati non corretti sono dati errati e richiede molto lavoro per utilizzare dati non validi o pulire dati non validi o entrambi.

UPDATE Dopo chiarificazione

costruire il proprio ETL (Extract, Transform, Load) processo per gestire tutti i dati in arrivo varianti. Molto probabilmente il tuo processo ETL verrà modificato con ogni nuovo batch di dati che ricevi perché dovrai intercettare le nuove varianti "Bad Data".

importare i dati in una tabella TUTTI VARCHAR
eseguire il processo ETL

  • buoni dati va in tabelle di dati reali
  • inappropriato dei dati va in una tabella di un'eccezione

Ripetere
Modifica processo ETL
Esegui processo ETL
Fino a No M Eccezioni minerale

- Fine Aggiornamento

Se si utilizza LEFT JOIN è possibile identificare i valori mancanti abbastanza facilmente.

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 restituisce un NULL sai che hai bisogno di aggiungere che "LOOKUPFIELD" al tuo tabella di ricerca. Ecco un buon libro per imparare la progettazione di database 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

Posso regolare questo per restituire il nome originale se nessun esempio di questo era nella mia tabella di ricerca? Motivo che chiedo è che ci sono transazioni 180k + di cui non ho bisogno di correggere tutti, alcuni possono essere lasciati così come sono. Grazie Chris – chris1982

+0

I valori mancanti non sono l'unico problema. Devi anche fare i conti con i valori che cambiano, come qualcuno che si sposta da Londra, Inghilterra a Parigi, Francia. –

+0

@ chris1982 - Qual è la ragione per cui desideri una tabella di ricerca? –

0

Come accennato in precedenza, il cattivo di dati è il proprio problema. La pulizia dei dati è un settore di per sé, quindi hai una vasta gamma di opzioni per questo tipo di problemi, dal semplice e diretto, ai tentativi elaborati per sistemare ogni campanello e fischietto. Ciò che è "migliore" dipende dalla tua situazione e dai tuoi bisogni.

Certamente è possibile continuare ad espandere questa tabella di ricerca per far fronte a un numero crescente di errori/variazioni standard, ma se si tratta di un flusso costante di informazioni c'è un sovraccarico di manutenzione. Questo potrebbe essere adeguato alle tue esigenze, quindi non esagerare solo perché ci sono alternative più elaborate.

È abbastanza comune scambiare l'affidabilità dell'intervento umano manuale per la scalabilità degli approcci automatizzati; questo è molto più facile da mantenere e da crescere, ma (a seconda della natura del problema) può commettere errori.

Es. 1. Utilizzare un approccio basato su modello (Contiene, LIKE, RegEx) per trovare qualcosa che sembra un adattamento ragionevole. Ciò potrebbe andar bene in alcune situazioni, ad esempio quando Nome_1 è un elenco statico e ben compreso, quindi è possibile assicurarsi che i risultati siano in genere sufficienti. + facile da installare/capire + più flessibile rispetto elenco completo - prende ancora un po 'di manutenzione - senza speranza nel complesso/situazioni poco conosciute

esempio 2. Nel caso più generale, è possibile utilizzare la ricerca funzionalità offerte dal database per "valutare" quanto è buono un valore di corrispondenza uno rispetto all'altro e scegliere l'opzione di corrispondenza migliore. Ancora una volta questo non è infallibile o sicuro in tutti i contesti, ed è un po 'più di lavoro da configurare, ma è molto più robusto. Questo è un po 'più intensivo in termini di prestazioni, quindi anche le dimensioni dei set di dati coinvolti, i tempi di elaborazione e l'infrastruttura disponibili sono considerazioni. + abbastanza buona percentuale di successo - impostazione più lenta - grandi spese generali di prestazione

esempio 3. Un'altra opzione potrebbe essere qualcosa di più specifico dominio. In questo caso, si tratta di dati spaziali, quindi è possibile utilizzare un servizio di geocodifica di terze parti come mezzo di convalida. + alto tasso di successo + in grado di affrontare con enormi campi di valori, - possa incorrere in costi aggiuntivi - più difficile/più lento per impostare

+0

Grazie per questa lettura interessante! Ho i dati a portata di mano e la risorsa per verificare nuove informazioni. Ora sto pensando al modo migliore per correggerlo. Grazie ancora. – chris1982

1

È possibile aderire alla tabella di ricerca e l'uso preferibile il valore dato lì. Se non trovato, utilizzare l'originale:

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 

Assicurarsi, che per ogni nome c'è al massimo una partita in TableLookupCities, altrimenti il ​​join produrrà molteplici risultati. Creare un indice univoco su TableLookupCities.Name:

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