1

我想将以下 IN 查询转换为内部联接查询:

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');

我有两个问题:

  1. 这个表很大,所以将这个 IN 查询更改为内部连接会加快速度。

  2. 将此逗号分隔的列表拆分为某个临时表中的列的最佳方法是什么。我见过很多正则表达式的例子,但它们看起来太复杂和太大了。

我正在使用 Oracle 11g 数据库。

表快照:

Id   name   country   rank
 1    tom    india     first
 2    jill   USA      second
 3    jack   aus       first
4

1 回答 1

0

从表 person_details 中选择国家、姓名、排名

查询在语法上不正确。您不需要关键字 TABLE。做就是了:

select country, name, rank from person_details

严格来说,你的表没有规范化。您不应将多个值存储在单个列中。迟早你会看到性能问题。重新设计表格并将值存储在单独的列中永远不会太晚。

话虽如此,有很多方法可以将逗号分隔的字符串拆分为行。这是在CONNECT BY子句中使用REGEXP_SUBSTRINSTR的一种简单方法:

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 STRING MANIPULATION中演示了其他方法。

于 2015-03-10T05:36:05.083 回答