Sql 查询多对多记录匹配
我有一张桌子,如下图所示 我想过滤ID,其中包含like中提供的所有标记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
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:否,键/值对的顺序无关紧要。数组中项目的顺序也不相同