Да, компилятор не должен передавать неявное this
указатель на static
методы. Даже если Вы не используете его в своем методе экземпляра, это все еще передается.
Использование 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 JOIN, поскольку он был стандартизирован. Соединения, отличные от ANSI, выглядят так:
SELECT *
FROM TABLE a,
TABLE b
WHERE INSTR(b.column, a.column) > 0
Я не собираюсь заморачиваться с примером не-ANSI LEFT JOIN. Преимущество синтаксиса ANSI JOIN заключается в том, что он отделяет то, что объединяет таблицы, от того, что на самом деле происходит в предложении WHERE
.
JOIN
идентичны записи WHERE
. Синтаксис JOIN
также называется ANSI JOIN, поскольку он был стандартизирован. Соединения, отличные от ANSI, выглядят так:
SELECT *
FROM TABLE a,
TABLE b
WHERE INSTR(b.column, a.column) > 0
Я не собираюсь заморачиваться с примером не-ANSI LEFT JOIN. Преимущество синтаксиса ANSI JOIN состоит в том, что он отделяет то, что объединяет таблицы, от того, что на самом деле происходит в предложении WHERE
.
JOIN
идентичны записи WHERE
. Синтаксис JOIN
также называется ANSI JOIN, поскольку он был стандартизирован. Соединения, отличные от 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, '%');
Of Конечно, это был бы чрезвычайно неэффективный запрос, потому что он выполнял бы полное сканирование таблицы.
Обновление: вот доказательство
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.