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

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

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

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

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

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

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

  1. select * from meals m
  2. join components c on c.meal_id=c.id
  3. join allergens a on a.component_id=c.id
  4. 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:

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

相关问题