如何在不使用 Sybase/Perl 中的游标的情况下从表/文件中的 2 行中获取结果集中的一行
Posted
技术标签:
【中文标题】如何在不使用 Sybase/Perl 中的游标的情况下从表/文件中的 2 行中获取结果集中的一行【英文标题】:How do I get one row in the result set out of 2 rows in the table/file without using cursors in Sybase/Perl 【发布时间】:2010-08-11 21:27:42 【问题描述】:我有一个表 T,其中包含 A、B、C 和 D 列,如下所示:
A B C D
===============
A1 B1 USD LIBOR
A1 B2 JPY FIXED
A2 B3 USD LIBOR
A2 B4 EUR FIXED
A3 B5 JPY FIXED
A3 B6 USD LIBOR
每个“A”表总是有 2 行,“B”的值不同。
“B”是唯一的
“A” - varchar(10)、“B” - varchar(8)、“C” - varchar(3)、“D” - varchar(5)
验证规则将列限制为以下格式 - “A”、“B”、“D” - 字母数字 "C" - 字母
我需要从表格中提取以下结果 -
结果集 1:
A1 USD LIBOR JPY FIXED
A2 USD LIBOR EUR FIXED
A3 JPY FIXED USD LIBOR
结果集 2:
USD LIBOR JPY FIXED
USD IBOR EUR FIXED
我希望避免使用游标,除非有其他解决方案。
我可以将此表提取到文件中并使用 perl 来获取结果吗?
请帮忙...
【问题讨论】:
啊,所以你没有LIST
功能。除非您可以在 Sybase 中创建用户定义的函数或聚合,否则从这个问题中看起来没有希望? ***.com/questions/491566/…
我必须从中提取的表有大约 100 列和数百万行。除了使用不是最佳解决方案的游标外,我还想尝试评估您建议的任何其他方法。甚至编写存储过程或函数也是可以接受的。
【参考方案1】:
它可以通过临时表和多次更新来完成,但我认为这在你的百万行表中不会很好。
如果您的数据总是每个“A”有 2 行,具有不同的“B”值,并且具有可预测的大小(列宽)或格式(因此您可以使用特殊的分隔符),那么这样的事情可能会起作用
SELECT
A,
MIN(B),
MAX(B),
right( MIN(B + C), 5),
right( MIN(B + D), 5),
right( MAX(B + C), 5),
right(MAX(B + D), 5)
FROM my_table
GROUP BY A
【讨论】:
我已经尝试了上面的查询,但它需要很长时间,我不得不中止。我已将 4 列提取到临时表“my_table”中,并在 B 上使用索引来运行查询。 关于使用临时表和更新来实现这一点的任何建议。以上是关于如何在不使用 Sybase/Perl 中的游标的情况下从表/文件中的 2 行中获取结果集中的一行的主要内容,如果未能解决你的问题,请参考以下文章