我不知道这是否有帮助,但这是严格使用 SQL 的 Oracle 版本。你没有在你的要求中提到它,但是第二次合并可以防止行中的重复条目:
创建表并插入示例行
DROP TABLE table_a;
DROP TABLE table_b;
CREATE TABLE table_a
(
id INTEGER
, all_names VARCHAR2 (128)
);
CREATE TABLE table_b
(
id INTEGER
, name VARCHAR2 (10)
);
INSERT INTO table_a (id, all_names)
VALUES (1, 'AB CD FG HI');
INSERT INTO table_a (id, all_names)
VALUES (2, NULL);
INSERT INTO table_b (id, name)
VALUES (1, NULL);
INSERT INTO table_b (id, name)
VALUES (2, 'Jon');
INSERT INTO table_b (id, name)
VALUES (2, 'Mike');
COMMIT;
合并允许重复
MERGE INTO table_a ta
USING (SELECT DISTINCT id, LISTAGG (name, ' ') WITHIN GROUP (ORDER BY name) OVER (PARTITION BY id) names
FROM table_b) tb
ON (ta.id = tb.id)
WHEN MATCHED
THEN
UPDATE SET all_names = all_names || tb.names
WHEN NOT MATCHED
THEN
INSERT (
ta.id, ta.all_names
)
VALUES (
tb.id, tb.names
);
SELECT *
FROM table_a;
ROLLBACK;
合并消除重复
MERGE INTO table_a ta
USING (SELECT DISTINCT id, LISTAGG (name, ' ') WITHIN GROUP (ORDER BY name) OVER (PARTITION BY id) names
FROM (WITH
aset
AS
(SELECT id, TRIM (all_names) || ' ' AS all_names
FROM table_a),
bset (id, name, REMAINDER)
AS
(SELECT id
, SUBSTR (all_names, 1, INSTR (all_names, ' ') - 1) name
, SUBSTR (all_names, INSTR (all_names, ' ') + 1) REMAINDER
FROM aset
UNION ALL
SELECT id
, SUBSTR (REMAINDER, 1, INSTR (REMAINDER, ' ') - 1) name
, SUBSTR (REMAINDER, INSTR (REMAINDER, ' ') + 1) REMAINDER
FROM bset
WHERE name IS NOT NULL)
SELECT id, name
FROM bset
WHERE name IS NOT NULL
UNION
SELECT id, name
FROM table_b
WHERE name IS NOT NULL)) tb
ON (ta.id = tb.id)
WHEN MATCHED
THEN
UPDATE SET all_names = tb.names
WHEN NOT MATCHED
THEN
INSERT (ta.id, ta.all_names)
VALUES (tb.id, tb.names);
SELECT *
FROM table_a;
--ROLLBACK;