【发布时间】:2018-06-06 15:15:17
【问题描述】:
我在 Firebird(方言 3)中编写了一个程序,它返回如下内容:
column1 | column2 | column3 | column4 | ...
----------|-------------|-----------|------------|--------
1 | 55 | 2.5 | 100€ | ...
具体的列名并不重要。我这样访问它
SELECT * FROM MY_PROCEDURE(:START_DATE, :END_DATE);
它只返回一行,所以我想我也可以使用 EXECUTE_PROCEDURE 访问它。 现在我想要的是转置返回中的列和行
row | result
----------|---------
column1 | 1
column2 | 55
column3 | 2.0
column4 | 100€
... | ...
我最初的做法是这样的:
select 'column1' AS row, column1 AS result
FROM MY_PROCEDURE(:START_DATE, :END_DATE)
union all
select 'column2' AS row, column2 AS result
FROM MY_PROCEDURE(:START_DATE, :END_DATE)
union all
...
基本上每列一个查询。有效。但是,最终我遇到了这个问题:
Dynamic SQL Error
Too many Contexts of Relation/Procedure/Views. Maxium allowed is 255.
所以我需要重组我的脚本。如您所见,我的 SQL 知识相当平庸,我根本不知道如何在单次选择中获取每一列作为一行。
有人可以帮忙吗?提前致谢。
【问题讨论】:
-
重写存储过程可能更简单,性能更好。顺便说一句:您使用了多少列?
-
调用程序 255 次以上来一次又一次地做同样的计算?确实,重写程序。或者制作一个辅助程序,调用这个程序,然后从变量中填充一些转置的 GTT(全局临时表)。
-
为什么还需要这个程序?它可以处理哪些数据,而您不能将其作为常规的
select而不是 PSQL 代码?
标签: firebird transpose unions firebird2.5