0

我有一个看起来像这样的程序。

CREATE PRODEDURE get_count
    @rdr CHAR(3)
AS
    SELECT t.cnt FROM (
    SELECT COUNT(*) cnt, 'X' rdr  FROM table_X
    UNION ALL
    SELECT COUNT(*) cnt, 'Y' rdr FROM table_Y
    UNION ALL
    SELECT COUNT(*) cnt , 'Z' rdr  FROM table_Z) t
    WHERE t.rdr = @rdr

是否可以使用我不知道的 case 语句或其他一些 Sybase 技巧来优化上述过程?所以,当你传入'X'时它使用table_X,当你传入'Y'时使用table_Y等等。优化的唯一动机是因为单独的count()操作需要很多时间,而且每次我做一个电话就停了……

4

2 回答 2

1

你可以通过两种方式做到这一点

1-在 if else 语句中添加查询

if @var="X"
select count(*) from table_X

if @var="Y"
select count(*) from table_Y

if @var="Z"
select count(*) from table_Z

或使用动态 SQL——将表名作为输入传递
declare @a varchar(30)
select @a= "table_name"
EXEC ("select count(*) from "+@a)

谢谢,

于 2013-05-10T14:14:23.253 回答
0

对每个单独的表运行 SELECT COUNT 查询并收集计数。然后将所有计数相加得到最终结果。

虽然这是以运行三个查询而不是一个查询为代价的,但它消除了 UNION 并允许您在rdr每个表的字段上使用索引。

于 2013-05-06T20:00:16.547 回答