SQL select语句优化(id,parent_id,child_ids)

时间:2014-05-07 18:15:09

标签: mysql sql oracle select optimization

我们有一个非常古老的自定义db(oracle,mysql,derby),它有以下限制:没有新表fileds,没有视图,没有函数,没有程序。

我的表MYTABLE:

    | id | ... | parent_id |
    ------------------------
    | 1  | ... |           |
    | 2  | ... |    1      |
    | 3  | ... |    1      |
    | 4  | ... |    2      |
    | 5  | ... |    1      |

我是我的第一个声明:

select * from MYTABLE where id in ('1','2','3','4','5');

给我5条记录。

然后我需要有关第一个(没有更深的)子ID的信息。 我目前的解决方案:

for (record in records) {
    // get child ids as comma separated string list 
    // e.g. "2,3,5" for id 1
    String childIds = getChildIds(record.id);
}

使用getChildIds(record.Id)中的第二个语句:

select id from MYTABLE where parent_id='record.Id';

所以我有1 + 5 = 6条陈述所需的信息。

我正在寻找一个解决方案来选择以下"想象中的记录"表"想象"字段" child_ids":

| id | ... | parent_id | child_ids |
------------------------------------
| 1  | ... |           | 2,3,5     |
| 2  | ... |    1      | 4         |
| 3  | ... |    1      |           |
| 4  | ... |    2      |           |
| 5  | ... |    1      |           |

有没有人知道我如何只用一个陈述(或用两个陈述)来获取这些信息?

感谢您的帮助,托马斯

1 个答案:

答案 0 :(得分:0)

FOR MYSQL:

如何使用GROUP_CONCAT()功能如下:

SELECT id, parent_id, 
       GROUP_CONCAT(child_id ORDER BY child_id SEPARATOR ',') AS child_ids 
FROM MYTABLE 
WHERE id IN ('1','2','3','4','5')

FOR ORACLE:

如果您有更高版本的Oracle,则可以使用LISTAGG()函数:

SELECT parent_id, 
       LISTAGG(child_id, ', ') WITHIN GROUP (ORDER BY child_id) "child_ids"
FROM MYTABLE 
WHERE id IN ('1','2','3','4','5')
GROUP BY parent_id

FOR DERBY:

我对德比一无所知,但做了一些研究它使用了IBM DB2 SQL语法。因此,使用XMLSERIALIZE()XMLAGG()XMLTEXT()的组合可能适合您:

SELECT parent_id,
       XMLSERIALIZE(XMLAGG(XMLTEXT(child_id) ORDER BY child_id) AS CLOB(30K))
FROM table GROUP BY parent_id