DB2, как получить не нравится для нескольких строк из двух таблиц - PullRequest
0 голосов
/ 04 мая 2018

Я начинающий разработчик DB2

У меня есть требование вывести нижеследующее, объединив две таблицы, чтобы показать результат исключенного подобного условия. введите описание изображения здесь

Список фруктов

Name       Type
----       ----
apple      fruit
cranberry  fruit
blueberry  fruit
neamleaf   leaf
lemongrass leaf

Фильтры:

Name       Type
----       ----
%berry     fruit
%grass     leaf
%root      vegetable

Отфильтрованный результат, показывающий, что фрукты не соответствуют списку фильтров like

Name       Type
----       ----
apple      fruit
neamleaf   leaf

Есть идеи, как его получить?

1 Ответ

0 голосов
/ 04 мая 2018

Я пробовал это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...