簡體   English   中英

查詢多對多記錄匹配

[英]query for many to many record matching

我有如下表tag_store

在此處輸入圖像描述

我想過濾所有標簽中提供的 id

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;

我想要的 output 是否應該只有 output id 1 因為它所有三個 tg_value 和 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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM