Oracle SQL如何从两个无关联表取数插入目标数据表
你不需要给无关联关系的两表强行写关联条件,直接用CROSS JOIN(交叉连接)即可,另外注意不要直接用Oracle内置的ROWID伪列:这个值存储的是行的物理地址,是类似AAAR3xAAEAAAACXAAA的字符串,不是你需要的从1开始的连续数字序号,生成顺序号直接用ROWNUM就行。
根据你实际的业务需求,分两种实现方式:
方式1:生成两表全量组合(笛卡尔积)
如果需要SALE的每一条记录都和SELL的每一条记录配对插入(按你提供的测试数据,最终会插入5*5=25条记录),直接执行以下语句即可:
INSERT INTO SALE_DETAIL(S_SALE,S_NUMBER,S_ARTICLE,S_COUNT) SELECT s.SALE_ID, ROWNUM S_NUMBER, d.SELL_ARTICLE, d.SELL_COUNT FROM SALE s CROSS JOIN SELL d;
执行后S_NUMBER会自动从1开始连续递增,完全匹配你的字段映射规则。
方式2:两表按行顺序一一配对
如果需要SALE和SELL按行顺序一一对应插入(比如SALE第1行配SELL第1行,按测试数据最终插入5条记录),需要注意:关系型数据库的表是无序集合,没有默认的“第几行”概念,必须先给两个表分别生成行号,再按行号关联。如果没有特殊排序要求,可以按数据库默认读取顺序生成行号,语句如下:
INSERT INTO SALE_DETAIL(S_SALE,S_NUMBER,S_ARTICLE,S_COUNT) SELECT s.SALE_ID, s.rn S_NUMBER, d.SELL_ARTICLE, d.SELL_COUNT FROM ( SELECT SALE_ID, ROWNUM rn FROM SALE -- 若需要固定顺序,加ORDER BY,比如ORDER BY SALE_ID ) s JOIN ( SELECT SELL_ARTICLE, SELL_COUNT, ROWNUM rn FROM SELL -- 若需要固定顺序,加ORDER BY,比如按插入顺序需要有时间字段做排序依据 ) d ON s.rn = d.rn;
提示:如果子查询不加
ORDER BY明确排序规则,数据库返回行的顺序不固定,无法保证和你插入数据的顺序一致,建议根据业务逻辑补充排序条件。
内容的提问来源于stack exchange,提问作者PIJUS_MAGNIFICUS
相关产品推荐
相关产品推荐

