如何在sql中使用一个像join?

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

例如:如果A中的列是'foo'。 那么如果B中的列是“fooblah”,“somethingfooblah”或者“foo”,那么连接就会匹配。 我知道如何在标准声明中使用通配符,但在进行连接时会感到困惑。 这有道理吗? 谢谢。

使用INSTR :

SELECT * FROM TABLE a JOIN TABLE b ON INSTR(b.column, a.column) > 0 

使用LIKE:

 SELECT * FROM TABLE a JOIN TABLE b ON b.column LIKE '%'+ a.column +'%' 

使用LIKE,使用CONCAT:

 SELECT * FROM TABLE a JOIN TABLE b ON b.column LIKE CONCAT('%', a.column ,'%') 

请注意,在所有选项中,您可能希望将列值设置为大写,然后进行比较,以确保获得匹配而不考虑区分大小写:

 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 

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

JOIN子句与编写WHERE子句相同。 JOIN语法也被称为ANSI JOINs,因为它们是标准化的。 非ANSI连接看起来像:

 SELECT * FROM TABLE a, TABLE b WHERE INSTR(b.column, a.column) > 0 

我不打算用非ANSI LEFT JOIN示例。 ANSI JOIN语法的好处在于,它将连接表与WHERE子句中实际发生的内容分开。

在MySQL中,你可以尝试:

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

当然,这将是一个大量低效的查询,因为它会做一个全表扫描。

更新:这是一个certificate

 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) 

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

例如,在插入到表B时,可以根据部分映射将零个或多个条目写入到映射B到A的Juncion表中。 同样,对任何一个表的更改都可以更新这个关联。

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

在连接中使用条件标准肯定不同于Where子句。 表之间的基数可以在连接和Where子句之间产生差异。

例如,在外连接中使用L​​ike条件将保留连接中列出的第一个表中的所有logging。 在Where子句中使用相同的条件将隐式地将连接更改为Inner连接。 为了在Where子句中完成条件比较,这个logging通常必须存在于两个表中。

我通常使用以前的答案中给出的风格。

 tbl_A as ta LEFT OUTER JOIN tbl_B AS tb ON ta.[Desc] LIKE '%' + tb.[Desc] + '%' 

这样我可以控制连接types。