我要转换的按照查询到内部联接查询:
select country, name, rank from table person_details
where country in ('india','USA','australia')
and name in ('tom', 'jill', 'jack')
and rank in ('first', 'third', 'fifith');
我有两个问题:
这个表是大等都将改变这个IN查询到内部联接将加快东西。
什么将成为拆分此逗号在一些临时表分隔列表的列最佳途径。 我看到很多的正则表达式的例子,但他们似乎过于复杂和大。
我使用Oracle 11g数据库。
表快照:
Id name country rank
1 tom india first
2 jill USA second
3 jack aus first
选择国家,姓名,从表person_details排名
查询语法不正确。 你并不需要的关键词表。 做就是了:
select country, name, rank from person_details
严格地说,你的表是不归 。 你不应该多值存储在一列。 迟早你会看到性能问题。 它是永远不会太晚重新设计你的表和值存储在单独的列。
话虽如此,有很多方法可以逗号分隔字符串分割成行。 这里是一个使用REGEXP_SUBSTR和INSTR在CONNECT BY子句一个简单的方法:
SQL> WITH DATA AS(
2 select q'['india','USA','australia']' countries,
3 q'['tom', 'jill', 'jack']' names,
4 q'['first', 'third', 'fifth']' ranks
5 from dual
6 )
7 SELECT regexp_substr(translate(countries,'''',' '), '[^,]+', 1, LEVEL) countries,
8 trim(regexp_substr(translate(names,'''',' '), '[^,]+', 1, LEVEL)) names,
9 trim(regexp_substr(translate(ranks,'''',' '), '[^,]+', 1, LEVEL)) ranks
10 FROM DATA
11 CONNECT BY instr(countries, ',', 1, LEVEL - 1) > 0
12 /
COUNTRIES NAMES RANKS
------------------------- --------------------- -------------------------
india tom first
USA jill third
australia jack fifth
SQL>
我已经证明了我的文章其它方式ORACLE DELIMITED字符串操作 。