我正在try 合并两个表之间的列,并对它们进行合并.虽然我能够在特定于一个表的列上使用group_concat,但也有一列需要从table1.role_idtable2.role_id中组合,并使用特定的分隔符连接结果.

我正在使用sqlite db.

SQL小提琴:link

Table1

name role_id dep_id
a 1 d1
a 1 d2
b 2 d3
b 3 d5
c 3 d4

Table2

name role_id ipv6 ipv4
a 1 ipv6_1 ipv4_1
a 2 ipv6_2 ipv4_1
b 7 ipv6_3 ipv4_2
b 7 ipv6_7 ipv4_8
e 2 ipv6_4 ipv4_3

我提出的问题

select t1.name,
          -- combine role_id column from both the tables and do group_concat on it??
          group_concat(DISTINCT t1.dep_id),
          group_concat(DISTINCT t2.ipv6),
          group_concat(DISTINCT t2.ipv4)
from       table1 t1
inner join table2 t2
        on t1.name = t2.name
group by t1.name

Current query output

name group_concat(DISTINCT t1.dep_id) group_concat(DISTINCT t2.ipv6) group_concat(DISTINCT t2.ipv4)
a d1,d2 ipv6_1,ipv6_2 ipv4_1
b d3,d5 ipv6_3,ipv6_7 ipv4_2,ipv4_8

预期结果

name CONCAT_role_id group_concat(DISTINCT t1.dep_id) group_concat(DISTINCT t2.ipv6) group_concat(DISTINCT t2.ipv4)
a 1,2 d1,d2 ipv6_1,ipv6_2 ipv4_1
b 2,3,7 d3,d5 ipv6_3,ipv6_7 ipv4_2,ipv4_8

推荐答案

使用UNION ALL代替join:

WITH
  common_names AS (SELECT name FROM table1 INTERSECT SELECT name FROM table2),
  cte AS (
    SELECT name, role_id, dep_id, null ipv6, null ipv4 FROM table1
    UNION ALL
    SELECT name, role_id, null, ipv6, ipv4 FROM table2
  )
SELECT name,
       GROUP_CONCAT(DISTINCT role_id) roles,
       GROUP_CONCAT(DISTINCT dep_id) deps,
       GROUP_CONCAT(DISTINCT ipv6) ipv6s,
       GROUP_CONCAT(DISTINCT ipv4) ipv4s
FROM cte
WHERE name IN common_names
GROUP BY name;

See the demo.

Sql相关问答推荐

如何在数组2中获取数组1的计数值

当编号和版本的唯一状态更改时报告

Microsoft Access UNION将长文本字段限制为255个字符

使用SQL/R循环查找邻居

如何从多行数据中获取一行合并数据?

连接特定行号

收到%1、%2或%2邮箱的唯一客户

最近3个月收到的邮箱总数

用户购买平台及金额统计

在一个子查询中签入ID';S,如果未返回,则签入另一个子查询

根据Rails活动记录中时间戳/日期时间的时间部分从PostgreSQL中提取记录

数据库SQL-CTE命名空间(错误?)使用临时视图

使用递归CTE在BigQuery中获取文件路径

如何使用Clickhouse的COUNT聚合返回所有列,但GROUP BY是这些列的子集

查找滑动窗口框架中的最大和最小列值

SQL:使用年/月/日分区查询某个时间段的数据

用另一个表中的特定名称替换 SQL 查询中的 ID.但我的两个表都有多个列

根据具有特定值的 ID 创建自定义组

PostgreSQL - 从同一张表中获取值

在多个表上递归查找