sql子集查询
Posted
技术标签:
【中文标题】sql子集查询【英文标题】:sql subset query 【发布时间】:2018-04-24 09:04:40 【问题描述】:关于子集的 SQL 问题,
考虑配方表、成分表和配方_成分连接表的数据库设计。对于这个问题,我们只需要连接表。
recipe_ingredient table:
Column | Type | Modifiers
--------+---------+-----------
r_id | integer | # Key to the recipe table
i_id | integer | # Key to the ingredient table
一个食谱需要一种或多种成分。 给定成分 ID 列表,是否可以找到所有兼容的食谱?兼容的配方将包含所提供成分的子集。
此查询已关闭。它允许我查看每个食谱所需的所有成分 ID。
select array_agg(i_id), r_id from recipe_ingredient group by r_id
我可以运行上述查询,然后将成分列表与我自己的代码列表进行比较。但是我想知道是否一切都可以在SQL级别完成,
我想做的是:
select array_agg(i_id), r_id from recipe_ingredient group by r_id
HAVING array_agg(i_id) IS_SUBSET_OF (:INGREDIENT_LIST)
这样的事情可能吗?
【问题讨论】:
【参考方案1】:假设您有一个食谱表:
select r.*
from recipes r
where not exists (select 1
from recipe_ingredient ri
where ri.r_id = r.id and
ri.i_id not in ( . . . )
);
这会获取所有没有您列表之外的成分的食谱。
【讨论】:
不应该是ri.i_id NOT in ( . . . )
吗?
我认为亚当建议的改变应该可行。谢谢。
这种查询有多快?
在recipe_ingredient(r_id, i_id)
上有索引应该很快。【参考方案2】:
将您的成分列表放入临时表变量中:
DECLARE @selectedIngredientList TABLE (id INT);
SELECT DISTINCT r_id
FROM recipe_ingredient ri INNER JOIN @selectedIngredientList i
ON ri.i_id = i.id
【讨论】:
不,这将返回与列表中一种成分匹配的食谱 - 它不会返回仅包含成分列表子集的食谱。以上是关于sql子集查询的主要内容,如果未能解决你的问题,请参考以下文章