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

Да, компилятор не должен передавать неявное this указатель на static методы. Даже если Вы не используете его в своем методе экземпляра, это все еще передается.

44
задан MPelletier 7 December 2013 в 01:20
поделиться

3 ответа

Использование 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 .

76
ответ дан 26 November 2019 в 21:55
поделиться

В 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)
19
ответ дан 26 November 2019 в 21:55
поделиться

Если это то, что вам нужно будет делать часто ... тогда вы можете денормализовать отношения между таблицами A и B.

Например, при вставке в таблицу B, вы можете записать ноль или более записей в таблицу соединений, отображающую B в A на основе частичного отображения. Точно так же изменения в любой таблице могут обновить эту связь.

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

5
ответ дан 26 November 2019 в 21:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: