我试图通过查询三个源表中的数据来在目标表中实现以下结果。
预期目标表结果:
ID Name DOB Codes Table1 Codes Table2
=================================================
A1 Bob 29-8-1972 2#5#8#3 5#8#4#2
-----------------------------------------------
A2 Tim 10/2/1954 4#3#7 1#7#5
-------------------------------------------------
来源表:
CustomerDetails表
ID Name DOB
=========================
A1 Bob 29/08/1972
-------------------------
A2 Tim 10/2/1954
-------------------------
客户代码1
ID Codes Table1
=================
A1 2
-----------
A1 5
----------------
A1 8
-------------
A1 3
----------
A2 4
--------------
A2 3
-------------
A2 7
-------------
客户代码表2
ID Codes Table2
===================
A1 5
--------------
A1 8
--------------
A1 4
-------------
A1 2
--------------
A2 1
--------------
A2 7
---------------
A2 5
----------------
对数百万条记录进行编码的最佳方法是什么?
答案 0 :(得分:1)
试试这个:
with tbl1(id ,cd1) as (
Select cd1.id , listagg(cd1.codes ,'#') within group (order by cd1.ID)
from code1 cd1
group by cd1.id
)
, tbl2(id,cd2) as (
Select cd2.id as id, listagg(cd2.codes ,'#') within group (order by cd2.ID)
from code2 cd2
group by cd2.id
)
SELECT CS.ID,
CS.NAME,
CS.DOB,
TB1.CD1,
TB2.CD2
FROM CUSTOMER CS
INNER JOIN TBL1 TB1
ON CS.ID = TB1.ID
INNER JOIN TBL2 TB2
ON CS.ID = TB2.ID
GROUP BY CS.ID,
CS.NAME,
CS.DOB,
TB1.CD1,
TB2.CD2 ;
答案 1 :(得分:0)
对于Oracle 11g及更高版本,您可以使用LISTAGG
(Oracle Doc.),如下所示:
SELECT cd.id,
cd.name,
cd.dob,
LISTAGG(cc1.codes ,'#') WITHIN GROUP (ORDER BY cd.id) AS "Codes Table1",
LISTAGG(cc2.codes ,'#') WITHIN GROUP (ORDER BY cd.id) AS "Codes Table2"
FROM CustomerDetails cd,
CustomersCode1 cc1,
CustomersCode2 cc2
WHERE cd.id = cc1.id (+)
AND cd.id = cc2.id (+);