举个数据例子:
CREATE OR REPLACE VIEW V_DM_C_D_CNT_3G_ACTV_INFO_1 AS
SELECT
MONTH_ID
FROM ZBA_DM.DM_C_D_CNT_3G_ACTV_INFO_NEW A,
ZB_DIM.DIM_PROV B
where A.prov_id=b.prov_id;
我现在的TABLE_LIST里面是有DM_C_D_CNT_3G_ACTV_INFO_NEW,DM_C_D_CNT_3G_ACTV_INFO,DIM_PROV的,我现在怎么通过TABLE_LIST得到这个视图里面的表示DM_C_D_CNT_3G_ACTV_INFO_NEW和DIM_PROV,而不要包括DM_C_D_CNT_3G_ACTV_INFO?
CREATE OR REPLACE VIEW V_DM_C_D_CNT_3G_ACTV_INFO_1 AS
SELECT
MONTH_ID
FROM ZBA_DM.DM_C_D_CNT_3G_ACTV_INFO_NEW A,
ZB_DIM.DIM_PROV B
where A.prov_id=b.prov_id;
我现在的TABLE_LIST里面是有DM_C_D_CNT_3G_ACTV_INFO_NEW,DM_C_D_CNT_3G_ACTV_INFO,DIM_PROV的,我现在怎么通过TABLE_LIST得到这个视图里面的表示DM_C_D_CNT_3G_ACTV_INFO_NEW和DIM_PROV,而不要包括DM_C_D_CNT_3G_ACTV_INFO?
a.pol_num=b.pol_num' 是假设从VIEW取出的值SELECT TRIM(SUBSTR('SELECT a.pol_num FROM tgp_policys A,tgp_certificates B where a.pol_num=b.pol_num',
INSTR('SELECT a.pol_num FROM tgp_policys A,tgp_certificates B where a.pol_num=b.pol_num',
'FROM') + 5,
INSTR('SELECT a.pol_num FROM tgp_policys A,tgp_certificates B where a.pol_num=b.pol_num',
'where') - INSTR('SELECT a.pol_num FROM tgp_policys A,tgp_certificates B where a.pol_num=b.pol_num',
'FROM') - 5)) STR
FROM dual T
create view view_1 as
select month_id
from ZBA_DM.DM_C_D_CNT_3G_ACTV_INFO_NEW
union all
select month_id from ZBA_DM.DM_C_D_CNT_3G_ACTV_INFO
不敢保证能做出来哈多谢。。按照刚才说的方式,匹配出来的都是表名,因为常规sql只有表别名、where、from这种条件,而这些关键字是不能做表名的,同时现有TABLE_LIST中的表名字符串均较长
想到一种比较死板的方法,其实这个问题归根结底就是在一个字符串里匹配单词。
我们这SQL中运用表的时候必须满足以下条件(可能还有我没想到的):
1. 表名的左边只能是:空格、点、换行符。
2. 表名的右边只能是:空格、逗号、分号(USER_VIEWS不知道有没有分号)、右括号。
按照上面的思路我们只需要在你的表名左右加上这些条件进行精确匹配就能够找出结果。
For Example:
测试表 TEST(相当于你的TABLE_LIST)
SS
SSS
SSSS
SSSSA
.SSSSA
s
SQL(只是找出了表名左边是空格或点,右边是空格的这两种情况)
SELECT t.nm
FROM TEST2 T
WHERE regexp_instr(upper(' ss sss ssss a.ssssa '),
'[[:space:]]' || upper(t.nm) || '[[:space:]]') > 0
or regexp_instr(upper(' ss sss ssss a.ssssa '),
'\.' || upper(t.nm) || '[[:space:]]') > 0;
结果:
SS
SSS
SSSS
SSSSA这种方法能够实现精确匹配。
但是有同样的问题:
1. VIEW中列名不能存在TABLE_LIST中
2. 创建VIEW时,对表或者列的别名不能存在TABLE_LIST.相信这种概率应该比较小吧,
上面只是一种大概的思路,欢迎大神更好的解决方法