2017-10-12 6 views
3

Ich versuche, Namen in 2 verschiedenen Tabellen zu vergleichen.Vergleichen von nicht identischen Feldern in zwei verschiedenen Tabellen

In Table1 heißt das Feld Name1 und hat Werte wie Lynn Smith.

In Table2 wird das Feld Name2 genannt, und es hat den Wert wie Lynn Smith (Extra)

Wie kann ich die beiden Namenswerte ignoriert den Text in den Klammern vergleichen? Ich möchte eine Abfrage schreiben, wo ich einige andere Felder brauche, in denen der Hauptname derselbe ist.

Antwort

3

Eine Methode würde like verwenden:

select . . . 
from t1 join 
    t2 
    on t2.name2 like t1.name1 + ' (%)'; 

Dies ist jedoch wahrscheinlich nicht effizient. Wenn Sie die Leistung möchten, können Sie den Namen in einer separaten Spalte in der zweiten Tabelle extrahieren und einen Index für ihn erstellen:

alter table t2 add column name_cleaned as 
    (left(name2, charindex(' (', name2 + ' (') - 2)); 

create index idx_t2_name_cleaned on t2(name_cleaned); 

Dann können Sie Phrase die Abfrage wie:

select . . . 
from t1 join 
    t2 
    on t2.name2_cleaned = t1.name1; 
+0

Das ist perfekt, vielen Dank – Suzy

0

Eine Möglichkeit, dies ist, um die Namen direkt nach der Reinigung auf einer Seite zu vergleichen. Im Gegensatz zu Gordons Antwort würde ich dies mit einer anderen Tabelle tun, die Daten enthält, die ich aus Tabelle2 vergleichen kann.

SELECT Table2Id, Name2, NULL as cleanedName INTO NewTable FROM Table2 

Jetzt aktualisieren wir die Spalte cleanedName, um zusätzliche Informationen aus der Spalte Name2 wie unten zu entfernen. Sie können auch einen Index für diese Tabelle erstellen.

UPDATE cleanedName 
SET cleanedName = LEFT (name2,CHARINDEX('(',Name2)) 

Jetzt löschen und neu erstellen Index auf CleanedName Spalt und dann vergleichen mit Table1.Name1 Spalte

0

Wenn alle Werte in Tabelle 2 Spalte2 Raum haben zwischen dem Ende des zweiten Namen und dem ersten (offen) Klammer dann könnte man diese verwenden:

SELECT SUBSTRING('Lynn Smith (Extra)',1,PATINDEX('%(%','Lynn Smith (Extra)')-2) 

Wenn Sie 'Lynn Smith (extra)' ersetzen waren mit dem Spaltennamen:

SELECT SUBSTRING('name2',1,PATINDEX('%(%','name2')-2) 

dann würde es eine Liste der Werte in Name2 ohne den Text in den Klammern anzeigen, mit anderen Worten, im selben Format (als solche) wie die Namen in name1 in table1.

SUBSTRING und PATINDEX sind String-Funktionen.

SUBSTRING fragt nach drei "Argumenten": (1) Ausdruck (2) Anfang und (3) Länge.

(1) Wie Sie oben das erste Argument sein kann, sehen kann (unter anderem) entweder eine Konstante - 'Lynn Smith (Extra)' oder eine Spalte - 'name2'

(2) Anfang des gewünschten Ergebnisses, in diesem Beispiel wird das erste (oder linke) Zeichen in der Zeichenfolge in der Spalte oder Konstante durch die Zahl 1 angezeigt.

(3) wie viele Zeichen möchten Sie sehen? das Ergebnis?In diesem Beispiel habe ich PATINDEX verwendet, um eine Nummer zu erstellen (siehe unten).

PATINDEX für zwei Argumente verlangt: (1)% Muster% und (2) Expression

(1) ist der Buchstabe oder eine Gruppe von Zeichen (Form oder 'Muster') Sie suchen, zu lokalisieren, die Grund für die Platzhalter %% jeder Seite des Muster ist, weil es

(2) ist

Zeichen auf jeder Seite des Musters sein kann (unter anderem) die konstante oder Spalte, die das Muster 1 von Argument enthält.

Während SUBSTRING cha zurückgibt racter data (Teil der Zeichenkette) PATINDEX erzeugt eine Zahl, diese Zahl ist das erste Zeichen im Muster (angegeben als Zahl, gezählt von der linken Seite des Ausdrucks).

Verwandte Themen