Sql 从多对多关系表中筛选项

Sql 从多对多关系表中筛选项,sql,postgresql,many-to-many,Sql,Postgresql,Many To Many,我有一个表“多对多”many\u关系,其中包括: 关系\u id唯一id set\u id链接到另一个带有集合的表 element\u id链接到另一个包含元素的表 因此,我们的想法是用多个集合来表示元素的“组”(1到多个元素) 我想做的是能够选择包含给定元素的所有集合(set\u id)。 例如,如果元素是[1,2,3],集合是[a,b] 想象一下: 集合“a”与元素1和2“链接” 集合“b”与元素1和3“链接” 然后,表多个关系将为: 关系id 集合id 元素id 11111 A.

我有一个表“多对多”
many\u关系
,其中包括:

  • 关系\u id
    唯一id
  • set\u id
    链接到另一个带有集合的表
  • element\u id
    链接到另一个包含元素的表
因此,我们的想法是用多个集合来表示元素的“组”(1到多个元素)

我想做的是能够选择包含给定元素的所有集合(
set\u id
)。 例如,如果元素是[1,2,3],集合是[a,b] 想象一下:

  • 集合“a”与元素1和2“链接”
  • 集合“b”与元素1和3“链接” 然后,表
    多个关系
    将为:
关系id 集合id 元素id 11111 A. 1. 222222 A. 2. 333333 B 1. 444444 B 3.
您可以使用
分组依据
拥有

select set_id
from many_relation
where element_id in (1, 2)
group by set_id
having count(*) = 2;  -- the "2" is the number of items in the `in` list
编辑:

在Postgres中,可以使用数组来实现这一点。例如:

select set_id
from many_relation
where element_id = any (array[1, 2])
group by set_id
having count(*) = cardinality(array[1, 2]);

为了清晰起见,重复该数组。您可以使用CTE来定义它(例如)。但是,我怀疑您正在将其作为一个参数传入,因此
将只在这两个位置。

您可以使用
分组方式
拥有

select set_id
from many_relation
where element_id in (1, 2)
group by set_id
having count(*) = 2;  -- the "2" is the number of items in the `in` list
编辑:

在Postgres中,可以使用数组来实现这一点。例如:

select set_id
from many_relation
where element_id = any (array[1, 2])
group by set_id
having count(*) = cardinality(array[1, 2]);
为了清晰起见,重复该数组。您可以使用CTE来定义它(例如)。但是,我怀疑您是将其作为参数传入的,因此
将只在这两个位置。

您可以使用array\u agg()来匹配条件,而不计算它们:

WITH many_relation(relation_id, set_id, element_id) AS (
    SELECT  *
    FROM    (VALUES
                (11111, 'a', 1)
            ,   (222222,'a', 2)
            ,   (333333,'b', 1)
            ,   (444444,'b', 3)) s
)
SELECT  set_id
FROM    many_relation
WHERE   element_id = ANY (array[1,2])
GROUP BY
    set_id
HAVING  array_agg(DISTINCT element_id) @> array[1,2];
您可以使用array_agg()来匹配条件,而不计算它们:

WITH many_relation(relation_id, set_id, element_id) AS (
    SELECT  *
    FROM    (VALUES
                (11111, 'a', 1)
            ,   (222222,'a', 2)
            ,   (333333,'b', 1)
            ,   (444444,'b', 3)) s
)
SELECT  set_id
FROM    many_relation
WHERE   element_id = ANY (array[1,2])
GROUP BY
    set_id
HAVING  array_agg(DISTINCT element_id) @> array[1,2];

用你正在使用的数据库标记你的问题。@GordonLinoff doneWill总是只有两个元素吗?@KaziMohammadAliNur否,可以有数百个元素。@GordonLinoff doneWill总是只有两个元素吗?@KaziMohammadAliNur否,可以是数百个元素,我知道,但我不想计算项目的数量。所以,摆脱这种状况。特别是因为它容易出错。如果有一个错误,一个集合被链接两次到同一个元素,那么它将被选择。我知道,但我不想计算项目的数量。所以,摆脱这种状况。特别是因为它容易出错。如果出现错误,并且一个集合链接到同一个元素两次,则将选中该集合