SQL table 合并特殊规则

SQL table merge with special rules

我有两个table

CREATE TABLE df1 (
    src varchar(255),
    dst varchar(255)
);

insert into df1 (src, dst) 
values 
('src1', 'dst1'), 
('src2', 'dst2'),
('src3', 'dst3');

CREATE TABLE df2 (
    src varchar(255),
    dst varchar(255)
);

insert into df2 (src, dst) 
values 
('dst1', 'dstDst1'), 
('dst1', 'dstDst2'),
('dst3', 'dstDst3');

我想这样合并(伪代码):

if df1.dst = df2.src:
  df1.dst = list(df1.dst, df2.dst)
else:
  no op

使用上面的例子,合并后的 table 变成

CREATE TABLE df3 (
    src varchar(255),
    dst varchar(255)
);

insert into df3 (src, dst) 
values 
('src1', 'dst1, dstDst1, dstDst2'), 
('src2', 'dst2'),
('src3', 'dst3, dstDst3');

如何从 df1 和 df2 构建 table df3?注意最后的 table dst 列可以是列表或字符串连接,任何一种方式都可以。

您可以尝试使用 OUTER JOIN 以下功能。

MySql你可以尝试使用GROUP_CONCAT函数

SELECT d1.src,coalesce(CONCAT(d1.dst,',',GROUP_CONCAT(d2.dst SEPARATOR ',')),d1.dst) dst
FROM df1 d1
LEFT JOIN df2 d2
ON d1.dst = d2.src
GROUP BY d1.src,d1.dst

sqlfiddle

Postgresql你可以尝试使用string_agg函数

SELECT src,
       CASE WHEN concat_result IS NULL 
        THEN  dst
        ELSE CONCAT(dst,',',concat_result)
       END dst
FROM (
    SELECT d1.src, d1.dst ,string_agg(d2.dst , ',') concat_result
    FROM df1 d1
    LEFT JOIN df2 d2
    ON d1.dst = d2.src
    GROUP BY d1.src,d1.dst
) t1

sqlfiddle

编辑

如果你使用的是snowflake你可以尝试在子查询中使用listagg,因为你的预期结果需要判断concat_result是否为null,所以我们可以使用CASE WHEN表达式来做吧。

SELECT src,
       CASE WHEN concat_result IS NULL 
        THEN dst
        ELSE CONCAT(dst,',',concat_result)
       END dst
FROM (
    SELECT d1.src, d1.dst ,listagg(d2.dst, ',') within group (ORDER BY d2.dst) concat_result
    FROM df1 d1
    LEFT JOIN df2 d2
    ON d1.dst = d2.src
    GROUP BY d1.src,d1.dst
) t1