2014-04-24 7 views
6

Sequel Pro verwenden, ich habe diese beiden Tabellen:"Like" Operator in INNER JOIN in SQL

Table1 

Name   Year x  y 
John Smith 2010 10  12 
Adam Jones 2010 8  13 
John Smith 2011 7  15 
Adam Jones 2011 9  14 
etc. 

und

Table2 

Name     Year z  
Smith John Smith John 2010 27 
Jones Adam Jones Adam 2010 25 
Smith John Smith John 2011 29 
Jones Adam Jones Adam 2011 21 
etc. 

Grundsätzlich sind die Namen in Tabelle 2 das gleiche nur mit dem letzten Name und Vorname vertauscht, dann einmal wiederholt. Die Namen in Tabelle 1 sind also in den Namen von Tabelle 2 zu finden ("John Smith" ist in "Smith John Smith John" zu finden). Ich möchte eine innere Verknüpfung und verbinden Sie den z-Wert von Table2 zu den anderen Werten von Tabelle 1 durchzuführen und so etwas wie diese:

Name  x  y  z 
John Smith 10 12 27 
Adam Jones 8  13 25 

So zu tun, dass ich diese Abfrage ausgeführt:

Select Table1.*, Table2.z 
From Table1 
Inner join Table2 
On Table1.Name like "%Table2.Name%" and Table1.Year=Table2.Year 

Aber ich habe dies als die Ausgabe:

Name Year x y z 

Und das ist es. Ich habe die Überschriften, aber keine Zeilen. Ich weiß nicht, was ich falsch mache ... Ich vermute, es hat wahrscheinlich damit zu tun, wie ich den gleichen Operator benutze, aber ich weiß es nicht. Jede Hilfe würde sehr geschätzt werden.

Antwort

15

Ein bisschen ein seltsames Datenmodell zur Seite, Sie haben die Tabellen im LIKE Teil umgedreht (table1.name sollte ein Teil von table2.name sein, nicht umgekehrt), und Sie müssen die hinzufügen Prozente zum Wert, nicht der Name des Feldes, das bedeutet nicht den Namen zu zitieren;

SELECT table1.*, table2.z 
FROM table1 
INNER JOIN table2 
    ON table2.name LIKE CONCAT('%', table1.name, '%') 
AND table1.year = table2.year 

An SQLfiddle to test with.

+1

Ja, das hat funktioniert. Vielen Dank! – japem

+4

TIL; CONCAT kam mit Sql Server 2012 und 2008 R2 hat es nicht. –

+3

Um den Kommentar von Ege zu erweitern, musste ich Folgendes für eine ältere Version von SQL verwenden: ON table2.name LIKE ('%' + table1.name + '%') – Hagelt18

4

Ihre Abfrage ist falsch, Sie sagen, dass der Inhalt der Spalte wie abcdTable2.Nameefgh sein soll. Das wäre richtig:

Select Table1.*, Table2.z 
From Table1 
Inner join Table2 
On Table1.Name like "%" + Table2.Name+ "%" and Table1.Year=Table2.Year 

Diese Abfrage wird für größere Tabelle ziemlich langsam sein, aber ich habe Angst, dass, wenn Sie auf einen Namen nur anschließen, kann die Tabelle nicht wirklich größer sein, wie Sie haben werden Duplikate ziemlich bald.

2

versuchen Sie dies:

Select Table1.*, Table2.z 
From Table1 
Inner join Table2 
On Table1.Name like Concat('%',Table2.Name,'%') and Table1.Year=Table2.Year 

in Ihrer Abfrage wird es für String-Suche enthält Table2.Name (es ist wie konstant)

als ein Vorschlag auf Namen Beitritt sehr, sehr schlecht ist, was passiert, wenn man 2 Person mit dem gleichen Namen ??! Sie müssen also einen Primär- und einen Fremdschlüssel dafür haben.

+0

Hmmm ... das scheint zu funktionieren, aber ich bekomme eine Fehlermeldung, dass die Syntax beim ersten Pluszeichen falsch ist. – japem

+0

@ user3081195 Ich habe die Abfrage auf SQL 2008 überprüft und es funktioniert gut. Verwenden Sie SQL Server? – RezaRahmati

+0

Ich benutze Sequel Pro – japem