Oracle查询,当一个SQL返回为一个列表,另一个SQL返回一个以逗号分隔的字符串,如何将这个两个SQL整合起来

执行第一个SQL为:

SELECT T.PARTY_HCODE
FROM REF_PARTY_BASICINFO T, (
		SELECT T3.pcode AS partycode, T3.ratingvalue AS rtvalue
		FROM (
			SELECT T2.PARTY_HCODE AS pcode, T2.effectdate AS edate, T2.ratingidx_value_hcode AS ratingvalue
			FROM REF_PARTY_RATING T2
			WHERE T2.ratingidx_value_hcode IN ('1', '2', '3', '4', '5')
		) T3
			JOIN (
				SELECT party_hcode, MAX(effectdate) AS medate
				FROM ref_party_rating
				WHERE rating_party_hcode = 'PTY000000013'
					AND ratingidx_hcode = 108
					AND EXPIRYDATE >= DATE '2019-8-29'
					AND EFFECTDATE <= DATE '2019-8-29'
				GROUP BY party_hcode
			) T4
			ON T3.pcode = T4.party_hcode
				AND t3.edate = t4.medate
	) T5
WHERE T.party_type IN (
		'029', 
		'030', 
		'003', 
		'004', 
		'005', 
		'006', 
		'007', 
		'008'
	)
	AND T.party_level = 1
	AND T.PARTY_HCODE = T5.partycode;

返回的结果为:

PTY000106813
PTY000106066
PTY000103964
PTY000103374
PTY000103120
PTY000103100
PTY000103027
PTY000103026
PTY000102998
PTY000102997
PTY000102991
PTY000102082
PTY000101955
PTY000101948
PTY000101902
PTY000101868
PTY000101865
PTY000101864
PTY000101861
PTY000101860
PTY000101859
PTY000101858
PTY000101853
PTY000101852
PTY000101837
PTY000101810
PTY000101804
PTY000101757
PTY000101743
PTY000101740
PTY000101738
PTY000101720
PTY000101715
PTY000101713
PTY000101711
PTY000101710
PTY000101708
PTY000101706
PTY000101703
PTY000101696
PTY000101694
PTY000101677
PTY000101669
PTY000101665
PTY000101660
PTY000101656
PTY000101650
PTY000101553
PTY000101551
PTY000101550
PTY000101442
PTY000101419
PTY000100912
PTY000100810
PTY000100769
PTY000100767
PTY000100763
PTY000100574
PTY000100433
PTY000100432
PTY000100343
PTY000100118
PTY000100090
PTY000100026
PTY000100002

但是还提供了一个SQL,SQL为:

SELECT t.param_value as text
FROM rule_fund_element t
WHERE t.param_key = 'rule_param_theory_limit_bank'

返回结果为:

PTY000101902,PTY000101703,PTY000101853,PTY000101948,PTY000101442,PTY000100574,PTY000102998,PTY000101861,PTY000101730,PTY000101740,PTY000101650,PTY000101550,PTY000101551,PTY000101738,PTY000100800,PTY000101860,PTY000100433,PTY000101720,PTY000101743,PTY000100912,PTY000101804,PTY000101553,PTY000101660,PTY000100704,PTY000101865,PTY000103027,PTY000106066,PTY000102997,PTY000101868,PTY000100769,PTY000106206,PTY000100810,PTY000101665,PTY000101696,PTY000100767,PTY000103374,PTY000103964,PTY000103120,PTY000100763,PTY000101711,PTY000101669,PTY000000233,PTY000101677,PTY000101715,PTY000102991,PTY000101713

如何将这两个SQL整合为一列数据,将要是我们所要解决的问题,将这两个SQL结合起来的SQL为:

WITH temp AS (
		SELECT t.param_value as text
        FROM rule_fund_element t
        WHERE t.param_key = 'rule_param_theory_limit_bank'
	)
SELECT regexp_substr(text, '[^,]+', 1, rn) AS city
FROM temp t1, (
	SELECT LEVEL AS rn
	FROM DUAL
	CONNECT BY LEVEL <= (
		SELECT LENGTH(text) - LENGTH(REPLACE(text, ',', NULL)) + 1
		FROM temp
	)
) t2
union all(
    SELECT T.PARTY_HCODE
FROM REF_PARTY_BASICINFO T, (
		SELECT T3.pcode AS partycode, T3.ratingvalue AS rtvalue
		FROM (
			SELECT T2.PARTY_HCODE AS pcode, T2.effectdate AS edate, T2.ratingidx_value_hcode AS ratingvalue
			FROM REF_PARTY_RATING T2
			WHERE T2.ratingidx_value_hcode IN ('1', '2', '3', '4', '5')
		) T3
			JOIN (
				SELECT party_hcode, MAX(effectdate) AS medate
				FROM ref_party_rating
				WHERE rating_party_hcode = 'PTY000000013'
					AND ratingidx_hcode = 108
					AND EXPIRYDATE >= DATE '2019-8-29'
					AND EFFECTDATE <= DATE '2019-8-29'
				GROUP BY party_hcode
			) T4
			ON T3.pcode = T4.party_hcode
				AND t3.edate = t4.medate
	) T5
WHERE T.party_type IN (
		'029',
		'030',
		'003',
		'004',
		'005',
		'006',
		'007',
		'008'
	)
	AND T.party_level = 1
	AND T.PARTY_HCODE = T5.partycode
)

其中from DUAL作为一个空表,Oracle提供最小的工作表,只能一行一列,具有某些特殊公用,常用来通过select语句计算常数表达式,

其中dual的特性为:

1.Oracle提供的最小的表,不论进行何种操作(不删除记录),他都只有一条记录---'X',例如执行select * from dual,里面只有一条记录X,执行insert into dual values('Y')后,再次查询dual仍显示一条记录

2.DUAL是SYS用户下的一张内部表,所有用户都可以使用DUAL名称访问,无论什么时候这个表总是存在

例如:执行一个查看当前日期的语句,select sysdate from dual,这条语句放在任何一个Oracle数据库中都不会报错,所以在做一些特定的查询时,用这个表时最稳妥的.

应用:

1.调用系统函数:

select to_char(sysdate, 'yyyy-mm-dd hh 24:mi:ss') from dual;

2.获得主机名

select sys_context('userenv', 'terminal') from dual;

3.获得当前locale

select sys_context('userenv', 'language') from dual;

4.获得一个随机数

select DBMS_RANDOM.random from dual;

5.查看序列值

(1)创建序列aaa以1开始,每次加1

create sequence aaa increment by 1 start with 1;

(2)获得序列aaa的下一个序列值

select aaa.nextValue from dual;

(3)获得序列aaa的当前序列值

select aaa.currval from dual;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值