Postgresql选择没有任何一组值的所有行
我有一张桌子叫餐点。膳食有许多成分,如糖浆、椰菜、牛排,每种成分都含有许多过敏原 我想选择没有任何过敏原列表的食物 如果我加入三个表格,并且不在。。。过敏原ID列表,如果有任何过敏原不在allegerns列表中,则会将食物退还给我,这是不正确的: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
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
);