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
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
编辑
如果你使用的是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
我有两个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
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
编辑
如果你使用的是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