当前位置: 代码迷 >> Oracle开发 >> ORACLE SQL 数据合并,该怎么解决
  详细解决方案

ORACLE SQL 数据合并,该怎么解决

热度:123   发布时间:2016-04-24 06:33:46.0
ORACLE SQL 数据合并
ORACLE SQL合并问题
请教大神们一个问题
如下表数据:
T1:

T2:

T3: 要求结果:


"表T1的ASSESS_ID 和表T2的ASSESS_ID  是一样的, RISK_ID 是个分组值,  TI表的RN 是以partition by ASSESS_ID,RISK_ID分组ORDER BY Control_ID 用分析函数ROW_NUMBER排序出来的结果,
T2表的RN 是以partition by ASSESS_ID分组ORDER BY ISSUE_ID 用分析函数ROW_NUMBER排序出来的结果, 
可能对同一个ASSESS_ID会有很多的ISSUE_ID,

两表join时要RN 相等为同一行数据,所以才排序。

现要求用一条SQL(非存储过程)生成表T3的数据,不能建表,update之类。

简言之 就是 每个RISK_ID会有数量不等的CONTROL_ID 和ISSUE_ID, 有一样的ASSESS_ID, 求帮忙

注意T3表RISK_ID 每行都应有数据,而Control_ID不存在可以为Null,表最终数据数量应与ISSUE_ID 个数相等,在线等,谢谢。"
表数据量很大,小弟只是举一个例子,请不要hardcode, 谢谢了,各位。

写了一点dummy的SQL,请大神们帮忙,

WITH T1 AS 
(
SELECT 1001 RISKID, 2001 CONTROLID,3001 ASSESSID, 1 RN
FROM DUAL
UNION ALL
SELECT 1001 RISKID, 2002 CONTROLID,3001 ASSESSID, 2 RN
FROM DUAL
),
T2 AS 
(
SELECT 4001 ISSUEID, 3001 ASSESSID, 1 RN
FROM DUAL
UNION ALL
SELECT 4002 ISSUEID, 3001 ASSESSID, 2 RN
FROM DUAL
UNION ALL
SELECT 4003 ISSUEID, 3001 ASSESSID, 3 RN
FROM DUAL
)
SELECT  xxxxxxxxxxx
FROM T1 , T2 
where .......

------解决思路----------------------

SELECT  nvl(t1.RISKID,(SELECT min(a.RISKID) FROM t1 a WHERE a.ASSESSID = t2.ASSESSID )) AS RISKID ,
                 t1.CONTROLID, 
                 t2.ISSUEID,
                 t2.ASSESSID
    FROM t1,t2 
 WHERE t1.rn(+) = t2.rn ;

有点取巧,如果ASSESSID对应的RISKID不一致取RISKID可能会出问题,因为无法获取T1表RN和ASSESSID来准确定位RISKID
------解决思路----------------------
抱歉,没注意,那就使用分析函数吧
select max(T1.RISK_ID)over() RISK_ID,T1.CONTROL_ID,T2.ISSUE_ID,T2.ASSES_ID
FROM T1 FULL JOIN T2 ON T1.RN=T2.RN
  相关解决方案