SQL Server запрос - вопрос цикла - PullRequest
       6

SQL Server запрос - вопрос цикла

3 голосов
/ 06 августа 2010

Я пытаюсь создать запрос, который будет генерировать таблицу перекрестной проверки с примерно 40 настраиваемыми столбцами, которые показывают Y или N. Сейчас у меня есть

SELECT DISTINCT [Company],
       [Option1],
       [Option2],
       [Option3],              
       CASE
         WHEN [Table1].[ID1] IN (SELECT ID2 FROM Table2 WHERE Variable = 1 AND Bit = 1) THEN 
           'Y'
         ELSE 'N'
       END AS 'CustomColumn1:',
       CASE 
         WHEN [Table1].[ID1] IN (SELECT ID2 FROM Table2 WHERE Variable = 2 AND Bit = 1) THEN 
           'Y'
         ELSE 'N'
       END AS 'CustomColumn1:',      
       CASE 
         WHEN [Table1].[ID1] IN (SELECT ID2 FROM Table2 WHERE Variable = 3 AND Bit = 1) THEN 
           'Y'
         ELSE 'N'
    END AS 'CustomColumn1:',
    .............
    -- REPEAT ANOTHER 40 times
    FROM [Table1] 
    WHERE [Table1].[OtherCondition] = 'True'
    ORDER BY [Company]

Итак, мой вопрос: как мне создать цикл (while? For?), Который будет циклически изменяться и назначать Y или N строке на основе условия, а не создавать 40+ операторов Case?

Ответы [ 4 ]

2 голосов
/ 06 августа 2010

Цикл (то есть итерация курсора) работает со строками, а не со столбцами.Вам все равно нужно будет иметь 40 выражений, по одному на каждый столбец, и производительность будет ужасной.И делайте свою лепту, рассказывая, что именно вам нужно, и создавая правильные показатели.То есть замените

CASE WHEN [Table1].[ID1] IN (SELECT ID2 FROM Table2 WHERE Variable = 2 AND Bit = 1)

на

CASE WHEN EXISTS (SELECT 0 FROM Table2 WHERE ID2 = [Table1].[ID1] AND Variable = 2 AND Bit = 1)
2 голосов
/ 06 августа 2010

Вы не можете использовать цикл, но вы можете создать хранимую процедуру / функцию для выполнения подвыбора и выражения case и вызывать их 40 раз.

Кроме того, вы можете улучшить производительность суб-выбора, изменив его на

SELECT 1 FROM Table2 WHERE EXISTS [Table2].[ID2] = [Table1.ID1] AND Variable = 3 AND Bit = 1
1 голос
/ 06 августа 2010

Если выходные данные так сильно отличаются от схемы, возникает вопрос, правильно ли схема моделирует бизнес-требования.Тем не менее, я бы порекомендовал просто написать SQL.Вы можете упростить SQL следующим образом:

Select Company
    , Option1, Option2, Option3
    , Case When T2.Variable = 1 Then 'Y' Else 'N' End As CustomCol1
    , Case When T2.Variable = 2 Then 'Y' Else 'N' End As CustomCol2
    , Case When T2.Variable = 3 Then 'Y' Else 'N' End As CustomCol3
    , Case When T2.Variable = 4 Then 'Y' Else 'N' End As CustomCol4
... 
From Table1 As T1
        Left Join Table2 As T2
            On T2.ID2 = T1.ID
                And T2.Bit = 1
Where T1.OtherCondition = 'True'
Group By T1.Company
Order By T1.Company

Если вы хотите написать что-то, что может помочь вам автоматически генерировать эти операторы Case (и вы используете SQL Server 2005+), вы можете сделать что-то вроде:

With Numbers As
    (
    Select 0 As Value
    Union All
    Select Value + 1
    From Numbers
    Where Value < 41
    )
Select ', Case When T2.Variable = ' + Cast(N.Value As varchar(10)) + ' Then ''Y'' Else ''N'' End As CustomCol' + Cast(N.Value As varchar(10))
From Numbers As N

Вы должны выполнить запрос, скопировать и вставить результаты в свою процедуру или код.

0 голосов
/ 06 августа 2010

Одним из способов могло быть использование оператора Pivot, который есть в MS SQL 2005+.Но даже в этом случае вы должны поместить 1 ... 40 жестко закодированных столбцов в оператор pivot.

Другой способ, который я могу придумать, - это создать динамический SQL, но это не так рекомендуется, так что мы можемэто то, что мы можем создать динамический SQL-запрос, запустив цикл while для таблицы, и можем создать большой SQL-файл, а затем выполнить его с помощью sp_execute.Так что шаги будут.

int @loopVar

SET @loopVar = 0

int @rowCount

varchar @SQL 

SET @SQl = ''
Select @rowcount = Count(ID2) from Table2

WHILE(@loopVar <= @rowCount)

BEGIN

// create ur SQL here

END

sp_execute(@SQL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...