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子集查询的主要内容,如果未能解决你的问题,请参考以下文章

cte sql 到 JPA 的简单子集查询

用于合并来自同一个表的两个聚合子集的 SQL 查询

T-SQL复合索引足以查询列的子集吗?

SQL - 使用 GROUP BY 获取子查询子集中或连接中的最新记录

查询雪花中数组的子集

行子集上的 SQL AVG