Я пробовал это:
create table master
(type varchar(10),
name varchar(25));
insert into master
values ('fruit', 'apple'),
('fruit', 'pineapple'),
('fruit', 'cranberry'),
('fruit', 'blueberry'),
('fruit', 'papaya'),
('fruit', 'orange'),
('leaf', 'neamleaf'),
('leaf', 'lemongrass'),
('leaf', 'orangegrass');
create table slave
(type varchar(10),
search varchar(25));
insert into slave
values ('fruit', 'pple'),
('fruit', 'berry'),
('leaf', 'grass');
select m.type, m.name
from master m
where not exists
(select *
from slave s
where s.type = m.type
and m.name like '%' || s.search || '%');
Это обеспечило следующий вывод:
type name
----- --------
fruit papaya
fruit orange
leaf neamleaf
Почему
Ваш показанный вывод меня немного смутил, потому что я не ожидал, что ваш запрос сработает в первую очередь. Конкатенация у меня не сработала (возможно, этот синтаксис специфичен для LUW, но, поскольку select
было написано slect
, я подозреваю, что ваш пример был набран вручную, а не вырезан и вставлен). Когда я попробовал ваш метод с синтаксисом, который работал для меня, я получил две строки для папайи и две строки для апельсина, а также по одной строке для каждого из других фруктов. Это связано с тем, что объединение с использованием m.type = s.type
предоставляет две строки для каждого из фруктов (по одной для каждой строки 'fruit' в slave
), а затем m.name not like '%'||s.search||'%'
отфильтровывает строки, которые не соответствуют полю поиска в результате. установлен.
Давайте посмотрим на нефильтрованный набор результатов:
m.type m.name s.type s.search filtered/output
------ ----------- --------- ----------- ---------------
fruit apple fruit pple xxxx filtered
fruit apple fruit berry output
fruit pineapple fruit pple xxxx filtered
fruit pineapple fruit berry output
fruit cranberry fruit pple output
fruit cranberry fruit berry xxxx filtered
fruit blueberry fruit pple output
fruit blueberry fruit berry xxxx filtered
fruit papaya fruit pple output
fruit papaya fruit berry output
fruit orange fruit pple output
fruit orange fruit berry output
leaf neamleaf leaf grass output
fruit lemongrass leaf grass xxxx filtered
fruit orangegrass leaf grass xxxx filtered