postgresql选择没有任何一组值的所有行

a11xaf1n  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(300)

我有一张table叫餐。膳食中含有许多成分(如土豆泥、椰子酱、牛排),每种成分都含有许多过敏原。
我想选择没有任何过敏原列表的食物。
如果我加入三个表,并且不在(。。。过敏原ID列表),这将返回我的膳食,如果它有任何过敏原不在列表中的allegerns排除,这是不正确的:

select * from meals m 
join components c on c.meal_id=c.id 
join allergens a on a.component_id=c.id
where a.id not in (1,2,3,4)

如果一顿饭有过敏原15和7,它仍然会从上面的查询返回。我怎么说“把所有不含以下过敏原的饭菜都还给我”
更新澄清示例。
假设我吃了一顿由土豆泥、豌豆和馅饼组成的饭。糖浆里有奶制品,馅饼里有麸质。然后我吃了一顿含有肉类过敏原的牛排(对素食主义者没有好处)。
土豆泥、豌豆、馅饼->奶制品、面筋
牛排,薯条->肉
我想选一种或几种不含奶制品的食物。结果应该是牛排/薯条餐。
如果我加入他们:

select * from meals m 
join components c on c.meal_id=c.id 
join allergens a on a.component_id=c.id

这会让我对每一种过敏原都有React。如果我加上where子句:

select * from meals m 
join components c on c.meal_id=c.id 
join allergens a on a.component_id=c.id
where a.id not in (2)

面筋会排成一排,所以不排除土豆泥/豌豆/馅饼。如何排除它?

nwlqm0z1

nwlqm0z11#

不存在(…)正是你想要的。
你自己的文字 I want to select the meal(s) which doesn't have any of a given list of allergens. 几乎可以直接转换为sql:

-- How do I say:
 -- Return me all meals
select * from meals m
where not exists ( --  which doesn't have 
        select * 
        from  components c  -- any of the following allergens
        join allergens a on a.component_id = c.id AND a.id in (1,2,3,4)
        where c.meal_id = m.id
        );

相关问题