Как проверить каждое поле в таблице - это подстрока поля в другой таблице

0

Моя схема выглядит так: у меня две таблицы: table1, table2 table1 имеет одно поле: table1-name строки типа. table2 имеет одно поле: table2-name строки типа.

Я хочу вернуть все строки table1-name, которые не являются подстрокой любых записей в table2-name. Я сделал:

SELECT DISTINCT 'table2-name'.'table2'
FROM 'table2', 'table1'
WHERE 'table2-name'.'table2' NOT IN (SELECT 'table1-name' FROM 'table1')
LIMIT 100;

Но это возвращает все table2-name, которые не равны имени table1-name. Мне нужно все table2-name, которые не являются подстрокой имени table2-name.

Пример:

table1-name: aa.abc.com, bb.com, xyz.com

table2-name: abc.com, aaa.com, xyz.com

Запрос, указанный выше, вернется:

abc.com
aaa.com

Я хочу вернуться:
aaa.com

Я не хочу, чтобы abc.com возвращался, потому что это подстрока aa.abc.com.

Вы можете исправить мой запрос?

  • 0
    Вам понадобится EXISTS вместо IN . Какая у вас СУБД? MySQL и SQL Server - это разные продукты. Вы отметили оба.
  • 0
    Я печатаю и выполняю запросы в mysql-workbench установленной Ubuntu.
Показать ещё 2 комментария
Теги:

3 ответа

3

Используйте NOT EXISTS для таких условий:

select *
from table1 t1
where not exists
(
  select *
  from table2 t2
  where t2.'table2-name' like concat('%', t1.'table1-name', '%')
);

BTW: вам следует избегать таких имен, как table2-name где вам нужны кавычки для их использования. table2_name этого используйте что-то вроде table2_name.

  • 0
    Я думаю, что вы имеете в виду, like не not like ? потому что мне нужно запросить те, которые не в результате запроса, где есть подстрока? или я что-то упустил?
  • 0
    @ user9371654: Вы правы, конечно. Я исправил свою ошибку.
Показать ещё 2 комментария
2

Если table2 не очень большая, мне интересно, как это будет выполняться:

select t1.*
from table1 t1 cross join
     (select group_concat(t2.name separator '|') as names
      from table2 t2
     ) t2
where t1.name not regexp t2.names;

Или, что эквивалентно:

select t1.*
from table1 t1 cross join
     (select group_concat(t2.name) as names
      from table2 t2
     ) t2
where find_in_set(t1.name, t2.names) = 0;

Это предполагает, что t2.name не имеет специальных символов (для regexp) или запятых (для find_in_set()).

  • 0
    Таблица 2 большая (2-3 миллиона записей). В настоящее время я использую запрос @Thorsten Kettner, и кажется, что он будет работать вечно.
  • 0
    @ user9371654. , , Ну, это точно не будет работать на таком большом столе. Это может быть не то, что вы можете сделать эффективно в MySQL.
Показать ещё 2 комментария
1

Чтобы проверить, является ли что-то подстрокой чего-то еще, вам нужно использовать либо "LIKE" (как показано ниже), либо, возможно, "REGEXP_LIKE".

SELECT DISTINCT table2.*
FROM table2
WHERE NOT EXISTS (SELECT 1 FROM table1 where table1.table1name LIKE CONCAT('%',table2.table2name,'%') > 0)
LIMIT 100;

На другой ноте
1 - ваше описание проблемы несовместимо (вы неоднократно смешиваете таблицы1 и таблицу2), выбор лучшего имени, скорее всего, поможет в этом.
2 - как вы увидите, я взял на себя смелость переименовать столбцы, чтобы сбросить символ "-".

Другая версия, которая будет работать:

SELECT DISTINCT table2.*
FROM table2
WHERE table2name NOT IN (SELECT table2.table2name FROM table1 where table1.table1name like CONCAT('%',table2.table2name,'%') > 0)
LIMIT 100;

Пожалуйста, проверьте SQLFiddle (я также скопировал версию Thorsten Kettner выше там после переименования таблиц/столбцов)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню