我有一个看起来像这样的程序。
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()操作需要花费很多时间而且每次我都做一个停顿的电话......
答案 0 :(得分:1)
你可以用两种方式做到这一点
1-在if else语句中添加查询
如果@ var =“X”
从table_X中选择count(*)
如果@ var =“Y”
从table_Y中选择count(*)
如果@ var =“Z”
从table_Z中选择count(*)
或使用动态SQL--传递表名作为输入
声明@a varchar(30)
选择@ a =“table_name”
EXEC(“选择计数(*)来自”+ @ a)
谢谢,
答案 1 :(得分:0)
在每个表上运行SELECT COUNT查询并收集计数。然后将所有计数加在一起以获得最终结果。
虽然这是以运行三个查询而不是一个查询为代价的,但它消除了UNION并允许您在每个表的rdr
字段上使用索引。