oracle 将表连接到包含多个值的表的字段

sshcrbum  于 2022-11-22  发布在  Oracle
关注(0)|答案(2)|浏览(139)

我 有 一 个 POST 表 和 一 个 TAG 表 , 我 解释 POST 表 包含 以下 字段 :id 、 title 、 content 、 tags _ ids , 这 意味 着 tags _ ids 字段 可以 包含 多 个 标签 , 例如 ID = 1 的 POST 具有 以下 标签 :tag_1 、 tag_2 和 tag_5 以 分隔 ;
POST 表

id         title       content     tag_id
----------  ----------  ----------  ----------
 1          title1      Text...     1; 2; 5
 2          title2      Text...     3
 3          title3      Text...     1; 2
 4          title4      Text...     2; 3; 4
 5          title4      Text...     2; 3; 4
 6          title2      Text...     3

中 的 每 一 个
TAG 表

id         name      
----------  ---------- 
 1          tag_1       
 2          tag_2       
 3          tag_3       
 4          tag_4       
 5          tag_5

格式
所以 , 我 想 知道 每 宗 个案 登记 了 多少 个 职位 。
这 是 我 的 疑问

select tag, COUNT(*) AS cnt
                  
        from(
            select CATEGORY.name,               
                case
                when POST.tag_id is not null then tag.name
                end as tag

                from POST
                left join TAG ON POST.tag_id = TAG.id
                     
            )
            GROUP BY tag
;

格式
这 是 我 想 在 查询 中 显示 的 结果

tag                     cnt
--------------------     --------------  
tag_1, tag_2, tag_5      1
tag_3                    2
tag_1, tag_2             1 
tag_2, tag_3, tag_4      2

格式
顺 祝 商祺

sqougxex

sqougxex1#

这里有一个选项:读取代码中的注解。
示例数据:

SQL> with
  2  post(id, tag_id) as
  3    (select 1, '1; 2; 5' from dual union all
  4     select 2, '3'       from dual union all
  5     select 3, '1; 2'    from dual union all
  6     select 4, '2; 3; 4' from dual union all
  7     select 5, '2; 3; 4' from dual union all
  8     select 6, '3'       from dual
  9    ),
 10  tag (id, name) as
 11    (select 1, 'tag_1' from dual union all
 12     select 2, 'tag_2' from dual union all
 13     select 3, 'tag_3' from dual union all
 14     select 4, 'tag_4' from dual union all
 15     select 5, 'tag_5' from dual
 16    ),

查询从此处开始:

17  post_distinct as
 18    -- number of rows per each distinct TAG_ID
 19    (select tag_id,
 20            count(*) cnt
 21     from post
 22     group by tag_id
 23    ),
 24  temp as
 25    -- split TAG_ID into rows
 26    (select tag_id,
 27            cnt,
 28            trim(regexp_substr(tag_id, '[^;]+', 1, column_value)) tag_id_split
 29     from post_distinct p cross join
 30       table(cast(multiset(select level from dual
 31                           connect by level <= regexp_count(p.tag_id, ';') + 1
 32                          ) as sys.odcinumberlist))
 33    )
 34  -- finally, join tables to get the result
 35  select listagg(t.name, ', ') within group (order by t.id) tag,
 36         te.cnt
 37  from tag t join temp te on te.tag_id_split = t.id
 38             join post_distinct p on p.tag_id = te.tag_id
 39  group by p.tag_id, te.cnt
 40  order by p.tag_id;

TAG                         CNT
-------------------- ----------
tag_1, tag_2                  1
tag_1, tag_2, tag_5           1
tag_2, tag_3, tag_4           2
tag_3                         2

SQL>
6l7fqoea

6l7fqoea2#

您 不 需要 拆分 帖子 , 只需 按 tag_id s 进行 聚合 即可 获得 预期 的 输出 :

SELECT tag_id,
       COUNT(DISTINCT id) AS num_posts
FROM   post
GROUP BY tag_id;

中 的 每 一 个
其中 , 对于 示例 数据 :

CREATE TABLE POST (id, title, content, tag_id) AS
SELECT 1, 'title1', 'Text...', '1; 2; 5' FROM DUAL UNION ALL
SELECT 2, 'title2', 'Text...', '3' FROM DUAL UNION ALL
SELECT 3, 'title3', 'Text...', '1; 2' FROM DUAL UNION ALL
SELECT 4, 'title4', 'Text...', '2; 3; 4' FROM DUAL UNION ALL
SELECT 5, 'title4', 'Text...', '2; 3; 4' FROM DUAL UNION ALL
SELECT 6, 'title2', 'Text...', '3' FROM DUAL;

CREATE TABLE TAG (id, name) AS
SELECT 1, 'tag_1' FROM DUAL UNION ALL
SELECT 2, 'tag_2' FROM DUAL UNION ALL
SELECT 3, 'tag_3' FROM DUAL UNION ALL
SELECT 4, 'tag_4' FROM DUAL UNION ALL
SELECT 5, 'tag_5' FROM DUAL;

格式
输出 :
| 标签 标识|帖子 数量|
| - -| - -|
| 1 、 二|一 个|
| 三 个|2 个|
| 第 1 、 2 、 5 页|一 个|
| 二 、 三 、 四|2 个|
如果 要 将 ID 转换 为 名称 , 请 执行 以下 操作 :

SELECT ( SELECT LISTAGG(name, '; ')
                  WITHIN GROUP (ORDER BY INSTR('; ' || p.tag_id || '; ', '; ' || t.id || '; '))
         FROM   tag t
         WHERE  INSTR('; ' || p.tag_id || '; ', '; ' || t.id || '; ') > 0
       ) AS tags,
       COUNT(DISTINCT id) AS num_posts
FROM   post p
GROUP BY tag_id;

格式
输出 :
| 标签|帖子 数量|
| - -| - -|
| 标签 _1 ; 标签 _2|一 个|
| 标签 _1 ; 标签 _2 ;标签 _5|一 个|
| 标签 _2 ; 标签 _3 ;标签 _4| 2 个|
| 标签 _3| 2 个|
如果 要 计算 每个 标签 的 帖子 数 , 请 执行 以下 操作 :

SELECT t.id,
       COUNT(DISTINCT p.id) AS num_posts
FROM   post p
       INNER JOIN tag t
       ON ('; ' || p.tag_id || '; ' LIKE '%; ' || t.id || '; %')
GROUP BY t.id

格式
输出 :
| 识别 码|帖子 数量|
| - -| - -|
| 2 个|四 个|
| 四 个|2 个|
| 三 个|四 个|
| 五 个|一 个|
| 一 个|2 个|
fiddle 的 最 大 值

相关问题