2009-08-12 58 views
0

我在這裏有一個冗長的查詢,並想知道它是否可以重構?如何重構此sql查詢

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

將數據插入表中並加入到表中。 – 2009-08-12 23:35:34

回答

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語句。

羅布

+0

+1我正在嘗試使用'PIVOT'來處理一個例子,但是你打敗了我。獎勵! – 2009-08-12 23:41:47

+0

:)乾杯比爾。 – 2009-08-13 02:24:17

+0

謝謝,那很好。但就性能而言,數據透視查詢的運行速度是否會比原始查詢快? – peanut 2009-08-13 04:21:28

0

我不完全確定你的例子,但看起來你應該能夠做一些事情。

  1. 創建一個很好的查找表,它會告訴你select語句給定的值應該放在那裏。這將會更短,應該非常快速。

  2. 在您的代碼中創建一個簡單的for循環,並生成一個包含50個小查詢的列表。

  3. 使用子選擇或通過一次往返生成選擇列表來檢索您的@ a1- @ A50值,然後使用它們生成查詢。

雅各

1

如果不考慮開發一個完整的答案的時候,我會試圖啓動:

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

然後轉動,要想讓一行結果集列的ABC1通過ABC50與ID值。

加入FROM中的那一行。

如果'somevalue','x'和'y'對所有五十個表達式都是常量。然後從:

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