繁体   English   中英

连接来自两个不同表的两个列,其中两个列都有部分相似的数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM