在sql中操作结果集

时间:2017-12-07 00:54:39

标签: join plsql

我试图通过查询三个源表中的数据来在目标表中实现以下结果。

预期目标表结果:

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
----------------

对数百万条记录进行编码的最佳方法是什么?

2 个答案:

答案 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 ;

SQLFIDDLE

答案 1 :(得分:0)

对于Oracle 11g及更高版本,您可以使用LISTAGGOracle 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 (+);