我们有一个非常旧的自定义数据库(oracle、mysql、derby),有限制:没有新表字段、没有 View 、没有函数、没有过程。
我的表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 | |
有人知道如何仅用一个语句(或两个语句)获取此信息吗?
谢谢你的帮助,托马斯
最佳答案
对于 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')
对于 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
对于 Derby :
我对 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
关于mysql - SQL select语句优化(id,parent_id,child_ids),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23525236/