我特林弄清楚,可以提取在SQL查询表之间的连接条件子句中的模式,假定ANSI符号正在使用中。提取从SQL语句连接条件定义甲骨文
例如,假设查询:
Select a.*, b.*, c.*, d.*
from a
inner join b
on a.c1 = b.c1
left outer join c on
c.c3 = b.c3 and b.c4 = c.c4
and c.c5 = b.c5
right join d on
d.c9 = c.c9
where d.c10 > 67 ;
我想获得:
1) b
on a.c1 = b.c1
2) c on
c.c3 = b.c3 and b.c4 = c.c4
and c.c5 = b.c5
3) d on
d.c9 = c.c9
我知道这个任务并不容易,但我不换货得到它完美地工作,所以比赛中的一些噪音被认为是可行的。还要注意,在随后的任务中噪音是可以治疗的。
我seraching在Oracle中USER_VIEW,所以为了使用REGEXP_ *功能,我做了一个源表进行读操作:
create table appo_view_text (viewname varchar2(30), viewtext clob);
insert into appo_view_text
SELECT VIEW_NAME,to_lob(TEXT) FROM USER_VIEWS;
commit;
和这里的查询,提取什么,我找:
with cfg as (
select '(INNER\s+JOIN|LEFT(\s+OUTER)?\s+JOIN|RIGHT(\s+OUTER)?\s+JOIN).+?(\1|WHERE|GROUP BY|$)' pattern
, 'i' modifiers
from dual
)
SELECT VIEWNAME, REGEXP_SUBSTR(sourcetxt, cfg.pattern, 1, level, cfg.modifiers) aa, viewtext
FROM (select viewname,
viewtext,
replace(replace(viewtext,chr(13)||chr(10),' '), chr(10), ' ') sourcetxt
from appo_view_text
where viewname = 'YOUR_VIEW_NAME') --> Put here a view name
cross join cfg
connect by level <= regexp_count(sourcetxt, cfg.pattern, 1, cfg.modifiers)
;
你会注意到正则表达式模式有一个问题,因为它是在上面的查询来定义:(\ 1 | $)元素将导致文本匹配一半的损失。 我尝试使用(?:(\ 1 | $)),但是这导致只有一行包含空字符串。
有什么想法?
如果你在一个单行合并您'viewtext',那么你就可以创建多个匹配组像'选择(表1)内的东西/左连接上t1.col = T2(表2 .col和t2.col2 = t1.col3)内部/左连接.......其中.....'。所以'(大括号)'中的所有组都是你想要返回的那个。这听起来像是你想要的东西吗? – Utsav
我没有合并在表视图文本,但我在提取查询alredy做(见“sourcetext”栏)。这并没有帮助,这里 – Max
这里的主要问题是找到一个新表的开头 – Gawil