2

我有一个格式如下的表:

DB_KEY     DB_VALUE
------     --------
row1       value1
row2;1     value2
row2;2     value3
row3       value4
row4;1     value5
row4;2     value6
row4;3     value7

我只想返回 DB_VALUE 列,如果 DB_KEY 的第一部分(分号之前)在任何行上都相同,则将这些行合并在一起。所以上面这个例子的回报是:

value1
value2value3
value4
value5value6value7

我想用 group by 做一些事情,但如果没有选择您分组的列,似乎无法使用。IE:

SELECT DB_VALUE FROM TABLE GROUP BY REXEP_SUBSTR(DB_KEY, ';', 1, 1)

任何建议将不胜感激。

4

3 回答 3

1

你可以做这样的事情

SQL> ed
Wrote file afiedt.buf

  1  with x as (
  2    select 'row1' db_key, 'value1' db_value from dual union all
  3    select 'row2;1', 'value2' from dual union all
  4    select 'row2;2', 'value3' from dual union all
  5    select 'row3', 'value4' from dual union all
  6    select 'row4;1', 'value5' from dual union all
  7    select 'row4;2', 'value6' from dual union all
  8    select 'row4;3', 'value7' from dual
  9  )
 10  select key,
 11         max( sys_connect_by_path(db_value, ' '))
 12             keep( dense_rank last order by curr ) db_value
 13    from (select key,
 14                 db_value,
 15                 row_number() over (partition by key
 16                                        order by db_value) curr,
 17                 row_number() over (partition by key
 18                                        order by db_value) - 1 prev
 19            from (select substr( db_key,
 20                                 1,
 21                                 (case when instr( db_key, ';' ) = 0
 22                                       then length(db_key)
 23                                       else instr( db_key, ';' ) - 1
 24                                   end)) key,
 25                          db_value
 26                     from x))
 27     group by key
 28   connect by prev = PRIOR curr and key = prior key
 29*    start with curr = 1
SQL> /

KEY                      DB_VALUE
------------------------ ------------------------------
row1                      value1
row2                      value2 value3
row3                      value4
row4                      value5 value6 value7

您还可以查看 Tim Hall 的页面,其中列出了 Oracle 中的各种字符串聚合技术。如果您使用的是 Oracle 11.2,或者您可以创建函数或类型,那么您应该能够生成一个更简单的查询来产生相同的输出。

于 2012-04-05T00:53:40.130 回答
0

您可以使用 WM_CONCAT 来实现这一点,但不是每个人都赞成这个功能。您可以使用其他一些连接功能来代替 WM_CONCAT,后者在较新版本的 oracle 中可用。


SELECT DISTINCT (SELECT DISTINCT NVL(WM_CONCAT(DB1.DB_VALUE), DB.DB_VALUE)
                   FROM DB_BUFFER DB1
                  WHERE SUBSTR(DB1.DB_KEY, 0, INSTR(DB1.DB_KEY, ';') - 1) =
                        SUBSTR(DB.DB_KEY, 0, INSTR(DB.DB_KEY, ';') - 1)) AS DB_VALUE
  FROM DB_BUFFER DB

这将检查 DB_KEY 部分的开始(之前;)。如果它匹配,它将所有值连接到一个字符串中。

于 2012-04-11T06:52:44.847 回答
0

如果您愿意创建一个 Oracle "group_concat" 聚合函数,那么您可以在查询中使用它来获得所需的结果。如果你搜索 AskTom 和 group concat,你会发现所有的定义。这是一个例子: http: //kb.yarmakconsulting.com/2008/06/oracle-analog-of-mysql-groupconcat.html

我想你也可以用分层查询来做到这一点。

于 2012-04-04T23:53:35.683 回答