鉴于以下架构:
create table TBL1 (ID varchar2(100) primary key not null, MATCH_CRITERIA varchar2(100));
create table TBL2 (ID varchar2(100) primary key not null, MATCH_CRITERIA varchar2(100));
create table TBL_RESULT (ID varchar2(100) primary key not null, TBL1_ID varchar2(100), TBL2_ID varchar2(100));
create unique index UK_TBL_RESULT_TBL1_ID on TBL_RESULT(TBL1_ID);
create unique index UK_TBL_RESULT_TBL2_ID on TBL_RESULT(TBL2_ID);
create sequence SEQ_TBL_RESULT;
insert into TBL1 VALUES('1', '1');
insert into TBL1 VALUES('2', '1');
insert into TBL1 VALUES('3', '1');
insert into TBL2 VALUES('4', '1');
insert into TBL2 VALUES('5', '1');
insert into TBL2 VALUES('6', '1');
我需要一个SQL语句,通过协调来自TBL1和TBL2的相等MATCH_CRITERIA来产生结果。
如果 UNIQUE约束不存在,以下内容将起作用。但是,我们在应用程序中需要唯一约束。
insert into TBL_RESULT (ID, TBL1_ID, TBL2_ID)
select SEQ_TBL_RESULT.nextval, TBL1.ID, TBL2.ID
from TBl1, TBL2
where TBL1.MATCH_CRITERIA = TBL2.MATCH_CRITERIA;
TBL_RESULT的输出示例
| ID | TBL1_ID | TBL2_ID |
| '1' | '1' | '5' |
| '2' | '2' | '4' |
| '3' | '3' | '6' |
注意:“1”与“4”或“6”匹配无关紧要。只要两个表中的MATCH_CRITERIA相等且结果表具有唯一的TBL1_ID和TBL2_ID。
请注意,我们从TBL1中插入了一百万条记录,从TBL2中插入了另外一百万条记录。因此,使用PL / SQL的顺序插入是不可接受的,除非它可以非常快地运行(少于15分钟)。
答案 0 :(得分:2)
怎么样:
INSERT INTO TBL_RESULT (ID, TBL1_ID, TBL2_ID)
SELECT seq_tbl_result.nextval,t1.id,t2.id
FROM
(SELECT t1.match_criteria,t1.id, row_number() OVER (PARTITION BY t1.match_criteria ORDER BY t1.id) rn
FROM tbl1 t1) t1,
(SELECT t2.match_criteria,t2.id, row_number() OVER (PARTITION BY t2.match_criteria ORDER BY t2.id) rn
FROM tbl2 t2) t2
WHERE t1.match_criteria=t2.match_criteria AND t1.rn=t2.rn
注意:它假定两个表中的每个匹配集中的行数相同。
答案 1 :(得分:0)
这样的事情:
insert into TBL_RESULT (ID, TBL1_ID, TBL2_ID)
select SEQ_TBL_RESULT.nextval, TBL1.ID, TBL2.ID
from TBl1, TBL2
where TBL1.MATCH_CRITERIA = TBL2.MATCH_CRITERIA
AND (NOT EXISTS (SELECT 1 FROM TBL_RESULT WHERE TBL1_ID = TBL1.ID) OR NOT EXISTS(SELECT 1 FROM TBL_RESULT WHERE TBL2_ID = TBL2.id))
这可以防止违反您的唯一约束。