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

标签 mysql sql oracle select optimization

我们有一个非常旧的自定义数据库(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/

相关文章:

sql - 授予用户对数据库中所有存储过程的执行权限?

单独的线程锁父级中的 Java JDBC 查询

MySQL Group By - 前 3 行和第 n 行

MySQL面试题

mysql - 如何存储元数据数据类型

java - 这个java错误是什么意思

java - 在select sql语句中将参数设置为null

oracle - 每个表的 : single global sequence vs. 序列哪个更好?

php - 将 Android 应用程序与 php 和 mysql 连接

mysql - mysql_real_connect中包含“@”符号的用户名