Моя схема выглядит так: у меня две таблицы: 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
.
Вы можете исправить мой запрос?
Используйте 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
.
like
не not like
? потому что мне нужно запросить те, которые не в результате запроса, где есть подстрока? или я что-то упустил?
Если 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()
).
Чтобы проверить, является ли что-то подстрокой чего-то еще, вам нужно использовать либо "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 выше там после переименования таблиц/столбцов)
EXISTS
вместоIN
. Какая у вас СУБД? MySQL и SQL Server - это разные продукты. Вы отметили оба.mysql-workbench
установленной Ubuntu.