SQL中内连接中的"Like"运算符

jap*_*pem 14 sql join sql-like

使用Sequel Pro,我有这两个表:

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.
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

基本上,表2中的名称仅与姓氏和名字切换相同,然后重复一次.因此表1中的名称在表2的名称中找到("John Smith"在"Smith John Smith John"中找到).我想执行内部联接并将Table2的z值连接到Table1的其他值并得到如下内容:

Name       x     y     z
John Smith 10    12    27
Adam Jones 8     13    25
Run Code Online (Sandbox Code Playgroud)

为此,我运行了这个查询:

Select Table1.*, Table2.z
From Table1
Inner join Table2
On Table1.Name like "%Table2.Name%" and Table1.Year=Table2.Year
Run Code Online (Sandbox Code Playgroud)

但我把它作为输出:

Name  Year  x  y  z
Run Code Online (Sandbox Code Playgroud)

就是这样.我得到了标题,但没有排.我不知道我做错了什么......我怀疑它可能与我使用类似操作符的方式有关,但我不知道.任何帮助将非常感激.

Joa*_*son 34

除了一些奇怪的数据模型,你已经在LIKE部分中转换了表格(table1.name应该是table2.name的一部分,而不是相反),你需要将百分比添加到,不是字段的名称,这意味着不引用名称;

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

一个要测试的SQLfiddle.

  • TIL; CONCAT附带Sql Server 2012和2008 r2没有它. (4认同)
  • 为了扩展Ege的注释,我必须使用以下内容在旧版本的SQL上执行此操作:ON table2.name LIKE('%'+ table1.name +'%') (3认同)

Tom*_*cak 5

您的查询不正确,您说该列的内容应该是这样的abcdTable2.Nameefgh.这是正确的:

Select Table1.*, Table2.z
From Table1
Inner join Table2
On Table1.Name like "%" + Table2.Name+ "%" and Table1.Year=Table2.Year
Run Code Online (Sandbox Code Playgroud)

这个查询对于更大的表来说会非常慢,但我担心如果你只是加入一个名字,那么这个表就不会真正变大,因为你很快会有重复的表.