[英]Join two columns from two different tables where both the columns have partially similar data
我有两个表,[A]和[B]。 我想将表[A]的[城市]列和表[B]的[知名城市]列上的两个表连接起来。
因此,表[A]中的[城市]列如下所示。
+---------------+
| City |
+---------------+
| Orlando |
| New York |
| Los Angeles |
+---------------+
表[B]中的[知名城市]列如下所示。
+----------------------------+
| [Cities renown for] |
+----------------------------+
| New York_Status of Liberty |
| Orlando_Disney World |
| Los Angeles_Hollywood |
+----------------------------+
我的表各有大约一万行,我想根据奥兰多=奥兰多_迪士尼世界等城市名称匹配列
所以我这样写我的查询。
Select a.[City]
from [A] as a
inner join [B] as b
on a.[City] = b.[Cities renown for]
where a.[City] = b.[Cities renown for]
我知道我在最后两行做错了,但是真的不知道如何解决
如果这是您可以控制的数据库,建议您更改结构。 如果表A只是城市列表,则城市名称应为主键。 然后,表2应该具有一个City
列,该列是TableA.City
列的外键。 如果表B用于存储某城市闻名的事物(并且每个城市可以因多项事物而闻名),则每个“知名度项目”都将有单独的一行(不确定这是否可行)。 这样,您的查询就会简单得多。
话虽如此,如果您无法更改数据库的结构,则可以使用简单的LIKE
运算符:
select TableA.City
from TableA
inner join TableB on
TableB.[Cities renown for] like TableA.City + '%'
作为@scsimon指出的那样,你不需要一个WHERE
这里。 同样,此方法将能够使用索引的[Cities renown for]
列。
这里的where
子句是多余的,因此您可以删除它,因为您使用的是inner join
。
由于Cities renown for
不完全匹配,因此您需要从该列中获取城市部分 。
就像是
Select a.[City]
from [A] as a
inner join [B] as b on
a.[City] = left(b.[Cities renown for] ,charindex('_',b.[Cities renown for] ) - 1)
但这使b.[Cities renown for]
上的索引不可用。 这也是基于样本数据的,其中逻辑似乎是City_Renowned for
意思是城市后跟下划线。 在上面的代码中,我们使用charindex
查找下划线的位置,并将所有内容都left
其下。
或者,如标签Alleman指出, LIKE
这可能会或可能不会提高性能。 这是一篇关于 。 的文章 :
Select a.[City]
from [A] as a
inner join [B] as b on
b.[Cities renown for] like a.[City] + '%'
使用CHARINDEX
查找“ _”可能会起作用。
为此,请与CTE进行交流。
;WITH A (City) AS (
SELECT * FROM (
VALUES
('Orlando'),
('New York'),
('Los Angeles')
) AS A (Column1)
),
B ([Cities renown for]) AS (
SELECT * FROM (
VALUES
('New York_Status of Liberty'),
('Orlando_Disney World'),
('Los Angeles_Hollywood')
) AS A (Column1)
)
SELECT *
FROM A
INNER JOIN B ON A.City = LEFT(B.[Cities renown for], CHARINDEX('_', B.[Cities renown for])-1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.