【发布时间】:2019-10-21 12:37:48
【问题描述】:
在 Firebird 2.5 或 3.0 和 Delphi 10.2 中:在主从配置中,每个主控始终至少有 1 个且不超过 4 或 5 个详细信息行,我需要获得具有某些字段的单行从主行和将每个详细行中的 1 个字段连接成单个 CSV 格式字符串的字段。我需要在 SQL 中完成这一切,而不必创建存储过程或用户函数,因为我需要针对客户数据库执行此操作,并且不想将对象添加到我不拥有的数据库中;如果不需要,我也不想在代码中使用计算字段,因为我们的支持人员需要能够通过数据库浏览器中的脚本来执行此操作,而不是将其构建到程序中。
为了对此进行建模,我使用了 RDB$INDICES 和 RDB$INDEX_SEGMENTS 系统表。每个索引获取一行或多行,每行都有一个段详细信息字段,非常简单:
SELECT
r.RDB$INDEX_NAME AS "Index",
f.RDB$FIELD_POSITION AS "Order",
f.RDB$FIELD_NAME AS "Fields"
FROM RDB$INDICES r
LEFT JOIN RDB$INDEX_SEGMENTS f ON r.RDB$INDEX_NAME = f.RDB$INDEX_NAME
WHERE r.RDB$FOREIGN_KEY IS NULL
AND UPPER(r.RDB$RELATION_NAME) = UPPER(:TBLNAME)
ORDER BY r.RDB$RELATION_NAME, f.RDB$FIELD_POSITION
但我需要的是每个索引返回一行,“字段”包含一个或多个段名称 - 例如针对具有SECTIONID 和KEYID 字段以及这两个字段的复合索引的表运行,上述查询中的“字段”列将包含SECTIONID,KEYID。我一生都无法弄清楚如何做到这一点,除非添加一个计算字段,该字段运行一个单独的查询并遍历构建字符串的结果集,这似乎不必要地复杂和头重脚轻。
有没有办法在 Firebird 的 SQL 中完全做到这一点?
【问题讨论】:
-
您可以尝试
LIST聚合函数,但请务必阅读有关订单的警告。 -
是的,就是这样!我不知道这个功能。谢谢,马克。