如何在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子句之间产生差异。
例如,在外连接中使用Like条件将保留连接中列出的第一个表中的所有logging。 在Where子句中使用相同的条件将隐式地将连接更改为Inner连接。 为了在Where子句中完成条件比较,这个logging通常必须存在于两个表中。
我通常使用以前的答案中给出的风格。
tbl_A as ta LEFT OUTER JOIN tbl_B AS tb ON ta.[Desc] LIKE '%' + tb.[Desc] + '%'
这样我可以控制连接types。