如何在sql中使用类似的连接?

44 mysql sql join sql-like

我有2个表,比如表A和表B,我想要执行连接,但是匹配条件必须是来自A'的列就像'来自B的列意味着任何事物都可以在列之前或之后出现B:

例如:如果A中的列是'foo'.如果B中的列是:'fooblah','somethingfooblah'或者只是'foo',则连接将匹配.我知道如何在标准的语句中使用通配符,但在进行连接时会感到困惑.这有意义吗?谢谢.

OMG*_*ies 76

使用INSTR:

SELECT *
  FROM TABLE a
  JOIN TABLE b ON INSTR(b.column, a.column) > 0
Run Code Online (Sandbox Code Playgroud)

使用LIKE:

SELECT *
  FROM TABLE a
  JOIN TABLE b ON b.column LIKE '%'+ a.column +'%'
Run Code Online (Sandbox Code Playgroud)

使用LIKE和CONCAT:

SELECT *
  FROM TABLE a
  JOIN TABLE b ON b.column LIKE CONCAT('%', a.column ,'%')
Run Code Online (Sandbox Code Playgroud)

请注意,在所有选项中,您可能希望在比较之前将列值驱动为大写,以确保您在不考虑区分大小写的情况下获得匹配:

SELECT *
  FROM (SELECT UPPER(a.column) 'ua'
         TABLE a) a
  JOIN (SELECT UPPER(b.column) 'ub'
         TABLE b) b ON INSTR(b.ub, a.ua) > 0
Run Code Online (Sandbox Code Playgroud)

最有效的将最终取决于EXPLAIN计划输出.

JOIN条款与写WHERE条款相同.该JOIN语法也被称为ANSI联接,因为他们进行了标准化.非ANSI JOIN看起来像:

SELECT *
  FROM TABLE a,
       TABLE b
 WHERE INSTR(b.column, a.column) > 0
Run Code Online (Sandbox Code Playgroud)

我不会打扰非ANSI LEFT JOIN示例.ANSI JOIN语法的好处是它将连接表的内容与WHERE子句中实际发生的内容分开.


Asa*_*aph 19

在MySQL中你可以尝试:

SELECT * FROM A INNER JOIN B ON B.MYCOL LIKE CONCAT('%', A.MYCOL, '%');

当然,这将是一个非常低效的查询,因为它会进行全表扫描.

更新:这是一个证明


create table A (MYCOL varchar(255));
create table B (MYCOL varchar(255));
insert into A (MYCOL) values ('foo'), ('bar'), ('baz');
insert into B (MYCOL) values ('fooblah'), ('somethingfooblah'), ('foo');
insert into B (MYCOL) values ('barblah'), ('somethingbarblah'), ('bar');
SELECT * FROM A INNER JOIN B ON B.MYCOL LIKE CONCAT('%', A.MYCOL, '%');
+-------+------------------+
| MYCOL | MYCOL            |
+-------+------------------+
| foo   | fooblah          |
| foo   | somethingfooblah |
| foo   | foo              |
| bar   | barblah          |
| bar   | somethingbarblah |
| bar   | bar              |
+-------+------------------+
6 rows in set (0.38 sec)
Run Code Online (Sandbox Code Playgroud)


Dav*_*res 5

如果这是你经常需要做的事情......那么你可能想要对表A和B之间的关系进行非规范化.

例如,在插入到表B时,您可以将零个或多个条目写入基于部分映射将映射B映射到A的juncion表.同样,对任一表的更改都可以更新此关联.

这完全取决于表A和B的修改频率.如果它们是相当静态的,那么在INSERT上点击就不那么痛苦了,然后重复点击SELECT.

  • 这是一个很好的解决方案,但称其为非规范化并不准确. (2认同)
  • 很公平.称之为联结表 (2认同)

Vit*_*kis 5

当使用我们的服务器编写查询时,LIKE 或 INSTR(或 T-SQL 中的 CHARINDEX)需要太长的时间,因此我们使用 LEFT,如下所示的结构:

select *
from little
left join big
on left( big.key, len(little.key) ) = little.key
Run Code Online (Sandbox Code Playgroud)

我知道这可能只适用于不同的查询结尾,与 '%' + b + '%' 的其他建议不同,但如果您只需要 b+'%' 就足够而且更快

另一种优化速度(但不是内存)的方法是在“little”中创建一个列,即“len(little.key)”作为“lenkey”,并在上面的查询中使用该列。