【问题标题】:SQL select statement optimizing (id, parent_id, child_ids)SQL 选择语句优化(id、parent_id、child_ids)
【发布时间】:2014-06-24 20:51:51
【问题描述】:

我们有一个非常古老的自定义数据库(oracle、mysql、derby),但有以下限制:没有新的表文件、没有视图、没有函数、没有过程。

我的表 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      |           |

有谁知道我如何只用一个语句(或 2 个语句)来获取这些信息?

谢谢你的帮助,托马斯

【问题讨论】:

  • 最后一个表不是真正的表。我需要(但我没有)这个表只用于一个 select 语句。

标签: mysql sql oracle select optimization


【解决方案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,您可以使用 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 一无所知,但做了一些研究,它使用 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

【讨论】:

  • 感谢您的快速回复。明天我会测试解决方案。我可以在所有 db (oracle, mysql, derby) 中使用这个语句吗?
  • 是否有针对所有db(oracle、mysql、derby)的声明?没有 swith-case 的解决方案将是完美的。
  • 据我所知,没有针对 Oracle、MySQL 和 Derby 的解决方案。尤其是在没有构建您自己的自定义函数的情况下。就内置功能支持而言,它们三者都有明显的不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 2012-11-01
  • 2013-03-07
相关资源
最近更新 更多