2016-04-11 15 views
0

I Tabellen zu verknüpfen versuchen, wo die nur zwei Tasten sind, das Spiel table1.Account und table2.keyJoining 2 SQL-Tabellen basiert auf Teilzeichenfolge

Aber das Problem ist, das Setup. Das table1.Account Feld hat 10 Stellen und nur die mittleren 4 oder 5 Ziffern mit dem table2.key

eg : 1234xxxx10 - > table1.Account matches with xxxx -> table2.key 

or 123xxxxx10 - > table1.Account matches with xxxxx -> table2.key 

ich dieses Stück Code JOIN INNER geschrieben haben, passen aber die Abfrage läuft weiter und gibt mir nicht wieder etwas .

SELECT DISTINCT column1, column2 
from table1 INNER JOIN table2 ON table1.Account like '%'+table2.key+'%' 
order by column1 
+0

Wenn Sie das "distinct" entfernen, sollten Sie einige Ergebnisse schneller erhalten. Und woher weißt du, ob die mittleren 4 oder 5 übereinstimmen? –

+0

vielleicht mit left() wäre schneller als wie – jpprade

+0

So müssen Sie mit einem sehr schlechten Datenbank-Design zu tun haben. Am besten wäre es, sie so zu ändern, dass getrennte Informationen in separaten Spalten stehen. Wenn Sie dies jedoch nur mit einer Abfrage lösen müssen, müssen Sie zuerst die Regel deklarieren, nach der Sie den betreffenden Teilstring finden. Sind es immer die vier oder fünf Zeichen vor den letzten zwei in der Zeichenfolge? Was ist, wenn beide Datensätze mit vier und fünf weiteren übereinstimmen? Bilden Sie diese Regel und denken Sie erst dann darüber nach, wie Sie die Abfrage schreiben. –

Antwort

1

SQL hat eine Teilfunktion:

https://msdn.microsoft.com/en-us/library/ms187748.aspx

SELECT DISTINCT column1, column2 
from table1 
INNER JOIN table2 
    ON table1.Account = substring(table2.key, 3, 4) 
    OR table1.Account = substring(table2.key, 4, 4) 
order by column1 

Ich weiß nicht, ob Sie das 'oder' in der on-Klausel müssen, sondern auf der Grundlage Ihrer Frage scheint es, wie Für diese Felder gibt es möglicherweise zwei Möglichkeiten. Unabhängig davon können Sie die on-Klausel nach Bedarf ändern, aber dieses Beispiel sollte Ihnen bei der Syntax helfen, die Ihr Hindernis zu sein scheint.

+0

Ich kann mir nicht vorstellen, wie die Leistung dafür von der Leistung der ursprünglichen Abfrage abweichen würde. –

+0

Gut, da er Like und Wildcards verwendet, um ein 4- oder 5-stelliges Feld mit einem 10-stelligen Feld zu vergleichen, muss er 7 Vergleiche für jeden versuchten Join machen, während meins nur 1 oder 2 macht, abhängig davon, ob er das braucht zweiter Teil der On-Klausel. –

+0

Zum Beispiel mit table1.Account = 'ABCDEFGHIJ' und table2.Key = 'DEFG', Teilstring (table1.Account, 4, 4) = table2.key macht 1 Vergleich, während table2.key wie '%' + table1.ACcount + '%' kann 7 Vergleiche machen. –