如何基于现有子项获取父记录

时间:2019-01-30 21:48:51

标签: sql oracle

我想按现有子代检索父记录。

例如我有:

父母表:膳食

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的餐食。查询应返回膳食A和B。 我不想使用诸如listagg或xmlagg之类的任何功能来将所有子名称都放在一列中,以后再使用LIKE。

非常感谢您的帮助。

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用聚合:

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

这假设一顿饭中没有重复配料。如果可以的话,您需要count(distinct ingredient) = 2

答案 1 :(得分:1)

您可以使用:

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 的孩子那里检索所有记录。 strong>如下:

 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