举个数据例子:
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?

解决方案 »

  1.   

    直接截取from到WHERE中的字符串,处理成table名,然后精确匹配吧
      

  2.   

    大概写了个思路。不过没写完,下面的语句能够取出全部表,但是还需要把表分开,现在没时间,晚上回去试试,如果很急的话就只有自己研究一下拉。此处:'SELECT a.pol_num FROM tgp_policys A,tgp_certificates B where 
    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
      

  3.   

    额,另外,我之前只是列举了一个例子,肯定还会存在这样的情况:
    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
      

  4.   

    总结的说,就是我视图匹配TABLE_LIST中的表A时,紧邻A的前面字符不能是字母、数字和下划线(但是可以是点,以为视图中存在用户名.表名的情况),而紧邻A的后面字符不能是下划线、字母和数字(点也不可以)
      

  5.   

    但是这些条件并不是表名特有的条件啊,就算按这种条件查出来的记过也不一定是表名,说时实话还真有点复杂,我晚上回去试试,
    不敢保证能做出来哈多谢。。按照刚才说的方式,匹配出来的都是表名,因为常规sql只有表别名、where、from这种条件,而这些关键字是不能做表名的,同时现有TABLE_LIST中的表名字符串均较长
      

  6.   

    6#的方法,可以用regexp_substr取代,更简洁,性能上就不好说了
      

  7.   

    6#的方法解决不了3#的精确匹配问题。。
    想到一种比较死板的方法,其实这个问题归根结底就是在一个字符串里匹配单词。
    我们这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.相信这种概率应该比较小吧,
    上面只是一种大概的思路,欢迎大神更好的解决方法