Создать SELECT с определенным количеством строк - PullRequest
0 голосов
/ 21 октября 2019

У меня есть хранимая процедура, которая должна вставлять несколько случайных строк в таблицу в зависимости от значений amount

@amount1 INT --EligibilityID = 1
@amount2 INT --EligibilityID = 2
@amount3 INT --EligibilityID = 3

Возможно, очевидным способом является использование TOP(@amount), но их многозначения и второй выбор гораздо больше. Итак, я искал способ сделать это в одном выражении, если это возможно.

INSERT INTO [dbo].[CaseInfo]
  SELECT ([EligibilityID],[CaseNumber],[CaseMonth])
  FROM (
    SELECT TOP(@amount1) [EligibilityID],[CaseNumber],[CaseMonth]
    FROM [dbo].[tempCases]
    WHERE [EligibilityID] = 1
  )

INSERT INTO [dbo].[CaseInfo]
  SELECT ([EligibilityID],[CaseNumber],[CaseMonth])
  FROM (
    SELECT TOP(@amount2) [EligibilityID],[CaseNumber],[CaseMonth]
    FROM [dbo].[tempCases]
    WHERE [EligibilityID] = 2
  )

INSERT INTO [dbo].[CaseInfo]
  SELECT ([EligibilityID],[CaseNumber],[CaseMonth])
  FROM (
    SELECT TOP(@amount3) [EligibilityID],[CaseNumber],[CaseMonth]
    FROM [dbo].[tempCases]
    WHERE [EligibilityID] = 3
  )

1 Ответ

1 голос
/ 21 октября 2019

Я бы порекомендовал использовать row_number, секционированный по eligibilityID, а затем сравнивать его с оператором case, чтобы каждый раз выбирать правильную переменную:

INSERT INTO [dbo].[CaseInfo]
  SELECT ([EligibilityID],[CaseNumber],[CaseMonth])
  FROM (
    SELECT [EligibilityID],[CaseNumber],[CaseMonth]
           ,row_number() over (partition by EligibilityID order by CaseNumber) as rn -- you haven't mentioned an ORDER BY, you can change it here
    FROM [dbo].[tempCases]
  ) as table1
  where rn<=case
                when EligibilityID=1 then @amount1
                when EligibilityID=2 then @amount2
                when EligibilityID=3 then @amount3
            end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...