Как получить родительскую запись на основе существующих детей - PullRequest
0 голосов
/ 31 января 2019

Я хотел бы получить родительские записи по существующим дочерним элементам.

Например, у меня есть:

Таблица родителей: Питание

ID  Meal
1   A
2   B
3   C

Дочерняя таблица: ингредиенты

ID MealID  Ingredient
1  1         x
2  1         y
3  1         z
4  2         x
5  2         y
6  3         x

Я хочу получить все блюда, в которых есть ингредиенты x и y.Query должен вернуть Meal A и B. Я не хочу использовать какую-либо функцию, такую ​​как listagg или xmlagg, чтобы все дочерние имена были в столбце, а затем использовать LIKE.

Я очень ценю вашу помощь.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Вы можете использовать:

select m.meal
  from Meal m
  join Ingredients i on i.mealid = m.id
 where i.Ingredient in ('x','y') --
 group by m.meal                 --| => These two rows guarantees exactly returning of two rows with ingr. x & y
 having count(*)>1; ---------------

 MEAL
 -----
 A
 B

Редактировать ( в зависимости от вашего последнего комментария ) :

Вы можете получить все записи от ребенка, у которых есть оба ингредиента X и Y с помощью существующие как показано ниже:

 select i.ID
   from Ingredients i
  where exists ( select 1 
                   from Ingredients
                  where MealID = i.MealID
                    and i.Ingredient in ('x','y') 
                  group by MealID    
                 having count(*)>1 
                );

ID
--
1
2
4
5

Rextester Demo

0 голосов
/ 31 января 2019

Вы можете использовать агрегацию:

select mealid
from ingredients
where ingredient in ('x', 'y')
group by mealid
having count(*) = 2;

Это предполагает, что ингредиенты не повторяются во время еды.Если они могут быть, вы хотите count(distinct ingredient) = 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...