我们有一个非常古老的自定义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 | |
有没有人知道我如何只用一个陈述(或用两个陈述)来获取这些信息?
感谢您的帮助,托马斯
答案 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