如何重构这个SQL查询

时间:2009-08-12 23:24:46

标签: tsql refactoring

我在这里有一个冗长的查询,并想知道它是否可以重构?

Declare @A1 as int
Declare @A2 as int
...
Declare @A50 as int

SET @A1 =(Select id from table where code='ABC1')
SET @A2 =(Select id from table where code='ABC2')
...
SET @A50 =(Select id from table where code='ABC50')

Insert into tableB
Select 
Case when @A1='somevalue' Then 'x' else 'y' End,
Case when @A2='somevalue' Then 'x' else 'y' End,
..

Case when @A50='somevalue' Then 'x' else 'y' End
From tableC inner join ......

从上面可以看出,有一些冗余的代码。但是我想不出让方法更简单的方法。

感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

如果您需要分配变量,可以转动表格......

SELECT *
FROM 
(
SELECT Code, Id
FROM Table
) t
PIVOT
(MAX(Id) FOR Code IN ([ABC1],[ABC2],[ABC3],[ABC50])) p /* List them all here */
;

...然后相应地分配它们。

SELECT @A1 = [ABC1], @A2 = [ABC2]
FROM 
(
SELECT Code, Id
FROM Table
) t
PIVOT
(MAX(Id) FOR Code IN ([ABC1],[ABC2],[ABC3],[ABC50])) p /* List them all here */
;

但我怀疑你真的需要分配它们。我真的无法想象你想要实现的目标。

透视可能会对您有所帮助,因为您仍然可以使用CASE语句。

罗布

答案 1 :(得分:1)

如果没有花时间来制定完整的答案,我会先尝试:

select id from table where code in ('ABC1', ... ,'ABC50') 

然后转动它,以获得一行ABC1到ABC50的结果集ID ID。

在FROM中加入该行。

如果'somevalue','x'和'y'对于所有50个表达式都是常量。然后从:

开始
select case id when 'somevalue' then 'x' else 'y' end as XY 
from table 
where code in ('ABC1', ... ,'ABC50') 

答案 2 :(得分:0)

我不完全确定你的例子,但看起来你应该可以做一些事情。

  1. 创建一个很好的查找表,它会告诉你select语句的给定值应该放在那里。这会短得多,应该非常快。

  2. 在代码中创建一个简单的for循环,并生成一个包含50个小查询的列表。

  3. 使用子选择或生成一次往返的选择列表来检索您的@ a1- @ A50值,然后使用它们生成查询。

  4. 雅各