我在这里有一个冗长的查询,并想知道它是否可以重构?
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 ......
从上面可以看出,有一些冗余的代码。但是我想不出让方法更简单的方法。
感谢任何帮助。
答案 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)
我不完全确定你的例子,但看起来你应该可以做一些事情。
创建一个很好的查找表,它会告诉你select语句的给定值应该放在那里。这会短得多,应该非常快。
在代码中创建一个简单的for循环,并生成一个包含50个小查询的列表。
使用子选择或生成一次往返的选择列表来检索您的@ a1- @ A50值,然后使用它们生成查询。
雅各