Sql 查询多对多记录匹配

Sql 查询多对多记录匹配,sql,postgresql,join,relational-division,Sql,Postgresql,Join,Relational Division,我有一张桌子,如下图所示 我想过滤ID,其中包含like中提供的所有标记 SELECT st.id from public."tag_store" st inner join (SELECT x.tg_type,x.tg_value FROM json_to_recordset ('[{ "tg_type":1, "tg_v

我有一张桌子,如下图所示

我想过滤ID,其中包含like中提供的所有标记

SELECT st.id  from public."tag_store" st
                inner join 
                    (SELECT  x.tg_type,x.tg_value FROM json_to_recordset 
                     ('[{ "tg_type":1, "tg_value ":"cd"},{ "tg_type":2,"tg_value ":"tg"},{ "tg_type":3,"tg_value ":"po" }]  '::json) 
                     AS x (tg_type int, tg_value TEXT)) ftg
                    on  st.tg_type= ftg.tg_type
                        and  st.tg_value = ftg.tg_value order by st.id;
我想要的输出是它应该只有输出id 1,因为它有所有三个tg_值和tg_id匹配

请帮忙,我应该换什么,或者有更好的替代品吗


谢谢

我将把这些值聚合到一个JSON数组中,并使用
@
操作符过滤那些具有所有值的值:

with tags as (
  select id, jsonb_agg(jsonb_build_object('tg_id', tag_id, 'tg_value', tag_value)) all_tags
  from tag_store
  group by id
)  
select *
from tags
where all_tags @> '[{"tg_id":1, "tg_value": "cd"},
                    {"tg_id":2, "tg_value": "tg"},
                    {"tg_id":3, "tg_value": "po"}]'
;

如果您愿意,也可以直接在HAVING子句中这样做

select id
from tag_store
group by id
having jsonb_agg(jsonb_build_object('tg_id', tag_id, 'tg_value', tag_value)) 
        @> '[{"tg_id":1, "tg_value": "cd"},
             {"tg_id":2, "tg_value": "tg"},
             {"tg_id":3, "tg_value": "po"}]'
;


请注意,这将返回除了比较数组中的标记之外还有其他标记的id。

已删除,我只是想让它无论如何都能正常工作,因此您希望将标记值列表传递给查询,只获取包含所有标记值的id?标记值和标记id。。。它应该匹配tag value和tag id,并且只返回那些具有tag\u id和tag\u value所有组合的id
tag\u id
列让我感到困惑。一行的
tag\u id=1
cd
,而另一行的
xx
值是什么?是。。。是的,它有一个主表,其中tag_id和它的类型storedIt看起来很棒,如果变量@>filter_data::text中有json,我应该做什么更改如果存储函数中有一个变量,那么将其声明为
jsonb
它是否需要相同顺序的标记类型和标记值。。。我有两个id,其中包含所有标记类型和标记值,但对于其中一个id,中间有一个额外的id,它不在id不存在的筛选器中returned@Md.ParvezAlam:否,键/值对的顺序无关紧要。数组中项目的顺序也不相同