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

Postgresql选择没有任何一组值的所有行,sql,postgresql,postgresql-10,Sql,Postgresql,Postgresql 10,我有一张桌子叫餐点。膳食有许多成分,如糖浆、椰菜、牛排,每种成分都含有许多过敏原 我想选择没有任何过敏原列表的食物 如果我加入三个表格,并且不在。。。过敏原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

我有一张桌子叫餐点。膳食有许多成分,如糖浆、椰菜、牛排,每种成分都含有许多过敏原

我想选择没有任何过敏原列表的食物

如果我加入三个表格,并且不在。。。过敏原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)
如果一顿饭含有过敏原1、5和7,则仍会从上述查询中返回。我怎么说把所有不含以下过敏原的食物都还给我

更新澄清示例

假设我吃了一顿由土豆泥、豌豆和馅饼组成的饭。土豆泥里有牛奶,馅饼里有麸质。然后我吃了一顿含有肉类过敏原的牛排,对纯素食者没有好处

土豆泥、豌豆、馅饼->奶制品、麸质

牛排、薯条->肉

我想选择一顿或几顿不含奶制品的饭菜。结果应该是牛排/薯条餐

如果我加入他们:

select * from meals m 
join components c on c.meal_id=c.id 
join allergens a on a.component_id=c.id
这会让我对每一种过敏原都有反应。因此,如果我添加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)

面筋将有一排,因此不排除土豆泥/豌豆/馅饼。如何排除它?

不存在。。。这正是你想要的

你自己的文本我想选择没有任何过敏原列表的食物。几乎可以直接转换为SQL:


不存在。。。这正是你想要的

你自己的文本我想选择没有任何过敏原列表的食物。几乎可以直接转换为SQL:


请尝试通过详细说明输入数据和预期输出结果来澄清您的示例,如果可能的话,可能需要更少的表格。好的,我添加了更多的表格来尝试澄清,这有帮助吗?请尝试通过详细说明输入数据和预期输出结果来澄清您的示例,如果可能的话,可能需要更少的表格。好的,我添加了更多的表格来尝试澄清,那有用吗?哦,该死的,直到。太好了,我走的是一条越来越多毛的CTE路线,谢谢。哦,该死的,直到。这太棒了,我正沿着一条有毛的CTE路线走,谢谢。
 -- 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
        );