как использовать подобное с объединением в sql?

У меня есть 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 JOINs выглядят так:

 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, '%');

Конечно, это будет массово неэффективный запрос, потому что он выполнит полное сканирование таблицы.

Обновление: вот доказательство

 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, основанную на частичном отображении. Аналогично, изменения в любой таблице могут обновить эту связь.

Все это зависит от того, как часто изменяются таблицы A и B. Если они довольно статичны, то удар по INSERT менее болезненен, чем повторные хиты на SELECT.

Использование условных критериев в соединении определенно отличается от предложения Where. Мощность между таблицами может создавать различия между предложениями Joins и Where.

Например, использование условия Like в Outer Join будет хранить все записи в первой таблице, перечисленной в объединении. Использование того же условия в предложении Where неявно изменяет соединение на внутреннее соединение. Запись должна, как правило, присутствовать в обеих таблицах для выполнения условного сравнения в предложении Where.

Обычно я использую стиль, указанный в одном из предыдущих ответов.

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

Таким образом, я могу управлять типом соединения.