sql - 使用新 ID 复制数据 - Oracle SQL
问题描述
我有一张桌子:
u_a_id c_id c_val
1 100 abc
1 101 xyz
1 102 www
2 100 qqq
2 101 rrr
2 102 ttt
我有 100 个这样的 u_a_id。我需要复制相同的内容,但将 u_a_id 增加 100 10 倍,因此总记录变为 1000。
因此,输出将是:
u_a_id c_id c_val
1 100 abc
1 101 xyz
1 102 www
2 100 qqq
2 101 rrr
2 102 ttt
101 100 abc
101 101 xyz
101 102 www
102 100 qqq
102 101 rrr
102 102 ttt
有没有快速的方法?
解决方案
您可以使用递归子查询因式分解子句:
甲骨文设置:
CREATE TABLE table_name ( u_a_id, c_id, c_val ) AS
SELECT 1, 100, 'abc' FROM DUAL UNION ALL
SELECT 1, 101, 'xyz' FROM DUAL UNION ALL
SELECT 1, 102, 'www' FROM DUAL UNION ALL
SELECT 2, 100, 'qqq' FROM DUAL UNION ALL
SELECT 2, 101, 'rrr' FROM DUAL UNION ALL
SELECT 2, 102, 'ttt' FROM DUAL
插入:
INSERT INTO table_name ( u_a_id, c_id, c_val )
WITH rsqfc ( u_a_id, c_id, c_val ) AS (
SELECT u_a_id + 100, c_id, c_val
FROM table_name
UNION ALL
SELECT u_a_id + 100, c_id, c_val
FROM rsqfc
WHERE u_a_id < 1000
)
SELECT u_a_id, c_id, c_val
FROM rsqfc
输出:
SELECT * FROM table_name
U_A_ID | C_ID | C_VAL -----: | ---: | :---- 1 | 100 | 美国广播公司 1 | 101 | xyz 1 | 102 | 万维网 2 | 100 | QQ 2 | 101 | rrr 2 | 102 | ttt 101 | 100 | 美国广播公司 101 | 101 | xyz 101 | 102 | 万维网 102 | 100 | QQ 102 | 101 | rrr 102 | 102 | ttt 201 | 100 | 美国广播公司 201 | 101 | xyz 201 | 102 | 万维网 202 | 100 | QQ 202 | 101 | rrr 202 | 102 | ttt ... 1001 | 100 | 美国广播公司 1001 | 101 | xyz 1001 | 102 | 万维网 1002 | 100 | QQ 1002 | 101 | rrr 1002 | 102 | ttt
db<>在这里摆弄
推荐阅读
- amazon-web-services - jinja 内部的 AWS Cloud-formation 内在函数
- javascript - 单击按钮我将值发送到模态框但接下来这个值发送到第二个模态框它可能在核心 php 中吗?
- django - 我可以使用 Django 在两个不同的 html 页面中显示分页数据吗?
- javascript - 由于使用 AJAX (axios) 上传大文件,如何克服浏览器延迟?
- scipy - 复函数的二重积分
- json - jq 添加额外的变量前缀
- java - 类中的差异全局变量方法中的差异变量
- c++ - 尝试用 C++ 编写一个程序,该程序将获取一个字符串数组并计算出现的元音数量
- flutter - 克隆使用旧 sdk 和包的项目后,如何解决所有 sdk 和依赖项问题?
- ios - 捕获音频样本以将音频实时推送到服务器