這與問題:SQL Statement for Reconciliation非常相關,但更加複雜。SQL Statement for reconciliation with different operators
下面給出的模式:
create table TBL1 (ID varchar2(100) primary key not null, MATCH_CRITERIA timestamp);
create table TBL2 (ID varchar2(100) primary key not null, MATCH_CRITERIA timestamp);
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);
insert into TBL1 VALUES('1', to_date('01/26/2012 20:00:00', 'mm/dd/yyyy hh24:mi:ss'));
insert into TBL1 VALUES('2', to_date('01/26/2012 20:05:00', 'mm/dd/yyyy hh24:mi:ss'));
insert into TBL2 VALUES('3', to_date('01/26/2012 19:59:00', 'mm/dd/yyyy hh24:mi:ss'));
insert into TBL2 VALUES('4', to_date('01/26/2012 20:04:00', 'mm/dd/yyyy hh24:mi:ss'));
我們目前查詢:
INSERT INTO TBL_RESULT (ID, TBL1_ID, TBL2_ID)
SELECT rawtohex(sys_guid()),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 between t2.match_criteria - (10/1440) AND t2.match_criteria + (10/1440)
AND t1.rn=t2.rn
它的輸出:
| ID | TBL1_ID | TBL2_ID |
| '1' | '1' | '3' |
| '2' | '1' | '4' |
| '3' | '2' | '3' |
| '4' | '2' | '4' |
如您所見,結果不符合唯一性約束(重複TBL1_ID /重複TBL2_ID)。這是因爲:
- 爲每個記錄的RN始終爲1(因而總是等於)
- 兩個記錄之間的時間是10分鐘。
我們期待的輸出,看起來像下表:
| ID | TBL1_ID | TBL2_ID |
| '1' | '1' | '4' |
| '2' | '2' | '3' |
注1:如果「1」與「3」 2匹配,但隨後」沒關係'應與'4'匹配以符合約束,並且只要T1.MATCH_CRITERIA在T2.MATCH_CRITERIA的10分鐘內。注2:我們從TBL1插入了100萬條記錄,另有100萬條記錄從TBL2插入。因此,使用PL/SQL進行順序插入是不可接受的,除非它可以運行得非常快(少於15分鐘)。
注3:不匹配的數據應該被消除。不平衡的數據也是預期的。
注4:我們不限於只執行1個查詢。一系列有限的查詢將會做。
發生什麼情況,如果有在T1行不能在T2(反之亦然)行相匹配?你是否消除了這些數據?或者你是否希望最終得到'TBL1_ID'或'TBL2_ID'爲NULL的輸出? –
順便說一下,您的測試數據在格式掩碼中使用了'MM'兩次。第二次你的意思是「MI」。這是一個常見的錯誤。 – APC
@JustinCave,消除數據。 – John