2016-06-10 10 views
1

Beide Spalten sind tinyint, wenn es darauf ankommt.SQL Join bei partiellen Spaltendaten (SQL Server)

Table1

Version 
-------- 
111115 
222226 
333337 

Table2

ID Year 
-------- 
5 2015 
6 2016 
7 2017 

Ich brauche 2 auf der ID aus der Tabelle kommen, wenn er den letzten Wert in dem Versionsfeld aus der Tabelle gleich 1.

Version 111115 würde sich mit ID 5 verbinden. Ich weiß, wie man auf solche Dinge auswählt, aber mitmacht g machbar? Das Ergebnis ist:

111115 5 2015 

TIA!

+1

Sie auf Umstellungen beitreten können Sie auf einem Feld machen, aber es gibt Performance Treffer. Sie könnten also bei SUBSTRING (table1.Version, len (version) -1, 1) = Table2.ID mitmachen, wenn Sie das wollten. Wahrscheinlich wäre es langsam. Besser ist es, dies in eine temporäre Tabelle zu werfen, indem Sie die Teilzeichenfolge und die Version darin auswählen und dann diese Tabelle mit Table2 verbinden. –

+0

Werden Sie jemals Werte von TABLE2.ID haben, die größer als 9 sind? Keine der bisherigen Antworten adressiert diese Situation. –

Antwort

1

können Sie die RIGHT() Funktion verwenden, um dies zu tun:

SELECT * 
FROM Table1 A 
INNER JOIN Table2 B on RIGHT(A.Version,1) = B.ID 

ich wahrscheinlich obwohl diese sehr viel zu tun, würde vermeiden, dass. Es ist ein fehlerhaftes Datenbankdesign. Vielleicht fügen Sie eine Spalte ID Tabelle 1, und verwenden:

UPDATE Table1 
SET ID = RIGHT(Version,1) 
+0

Genau das habe ich gebraucht, danke! – Joshua

+0

@Joshua Kein Problem, Prost –

1

Da sie beide integer sind, können Sie das Modul Operator versuchen. Es dauert der Rest nach der Teilung. So 111115 % 10 ist 5.

SELECT * 
FROM Table1 t1 
INNER JOIN Table2 t2 on t1.Version % 10 = t2.ID 
0
Declare @tblTest as table 
(
    id INT, 
    yearName INT 
) 


Declare @tblVersion as table 
(
    VersionNo INT 
) 

INSERT INTO @tblTest values(5,2015) 
INSERT INTO @tblTest values(6,2016) 
INSERT INTO @tblTest values(7,2017) 

INSERT INTO @tblVersion values(111115) 
INSERT INTO @tblVersion values(111116) 
INSERT INTO @tblVersion values(111117) 


select 
*,RIGHT(VersionNo,1) 
from @tblVersion 

SELECT 
* 
FROM @tblTest T1 
LEFT JOIN (SELECT RIGHT(VersionNo,1) AS VersionId,VersionNo FROM @tblVersion) T2 ON T2.VersionId=T1.id