SQL技术问询:如何将unsubscribe_type为'Marketing and Reminder'的单条记录拆分为两条记录
拆分Unsubscribe类型记录的SQL解决方案
嘿,我来帮你搞定这个拆分记录的需求!其实你一开始想到的UNION ALL路子是完全正确的,可能只是细节没捋顺,我给你两种实用的方法,包你能用:
方法一:用UNION ALL拆分(直观易理解)
这种方法就是把符合条件的记录分别查询两次,每次替换成对应的类型,再合并插入到目标表。假设你的原表叫original_table,目标表叫target_table,代码如下:
INSERT INTO target_table (No, Name, Address, unsubscribe_type) -- 生成Marketing类型的记录 SELECT No, Name, Address, 'Marketing' AS unsubscribe_type FROM original_table WHERE unsubscribe_type = 'Marketing and Reminder' UNION ALL -- 生成Reminder类型的记录 SELECT No, Name, Address, 'Reminder' AS unsubscribe_type FROM original_table WHERE unsubscribe_type = 'Marketing and Reminder';
注意点:
如果目标表的No是自增主键(就像你示例里的No从1变成2那样),那你不用在INSERT里指定No字段,让数据库自动生成就行,代码可以改成:
INSERT INTO target_table (Name, Address, unsubscribe_type) SELECT Name, Address, 'Marketing' FROM original_table WHERE unsubscribe_type = 'Marketing and Reminder' UNION ALL SELECT Name, Address, 'Reminder' FROM original_table WHERE unsubscribe_type = 'Marketing and Reminder';
方法二:用CROSS JOIN + VALUES(更简洁高效)
如果以后你需要拆分更多类型,这种方法更省心,不用重复写WHERE条件:
INSERT INTO target_table (No, Name, Address, unsubscribe_type) SELECT ot.No, ot.Name, ot.Address, split_types.type FROM original_table ot -- 这里列出需要拆分的所有类型 CROSS JOIN ( VALUES ('Marketing'), ('Reminder') ) AS split_types(type) WHERE ot.unsubscribe_type = 'Marketing and Reminder';
这个逻辑是把每条符合条件的记录,和我们定义的两个类型做交叉关联,自动生成两条记录,代码更精简,维护起来也方便。
内容的提问来源于stack exchange,提问作者Harvey
相关产品推荐
相关产品推荐

