2009-08-12 3 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

Вставьте данные в таблицу и присоедините к ней. –

ответ

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', но вы избили меня. Престижность! –

+0

:) Приветствия Билла. –

+0

спасибо, это приятно. но с точки зрения производительности, будет ли опорный запрос работать быстрее исходного запроса? – peanut

0

Я не совсем уверен в вашем примере, но похоже, что вы должны сделать одно из нескольких вещей.

  1. Создайте таблицу с хорошим поиском, которая сообщит вам о заданном значении оператора select, который должен быть размещен там. Это будет намного короче и должно быть безумно быстрым.

  2. Создайте простой цикл в своем коде и сгенерируйте список из 50 небольших запросов.

  3. Используйте подвыбор или сгенерируйте список выборок с одним раундом, чтобы получить значения @ a1- @ A50, а затем сгенерируйте запрос с ними уже на месте.

Jacob

1

Без учета времени, чтобы развить полный ответ, я хотел бы начать, пытаясь:

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

затем поворот, что, чтобы получить одну строку результирующего набора столбцов АВС1 через 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') 
Смежные вопросы