Выбрать или вставить данные в таблицу с помощью курсора - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь извлечь одну запись за раз из набора результатов, чтобы использовать ее в качестве значения в операторе выбора для вставки данных в таблицу.

select [Id] 
from TBL 
where PId = '123' 
order by value

Результат-set1

222
333
444
555

Запрос № 2:

select [Id] 
from TBL 
where PId = '456' 
order by value

Результат-set2

666
777
888
999

Наконец, я пытаюсь вставить данные в таблицу, взяв значения из Result-set1 и Result-set2.

insert into TBL ([Val], [Disp], [Seq], [Active], [DId], [PId])
    select [Val], [Disp], [Seq], [Active], 'One Record From Result-set1', '1111' 
    from TBL 
    where PId = '2222' 
      and DId = 'One Record From Result-set2'

Я прочитал, что курсор помогает извлекать одну запись за раз из набора результатов, но я не уверен, как реализовать это в моем сценарии.

insert into TBL ([Val], [Disp], [Seq], [Active], [DId], [PId])
    select [Val], [Disp], [Seq], [Active], '222', '1111' 
    from TBL 
    where PId = '2222' 
      and DId = '666'

Я пытаюсь избавиться от жесткого кодирования 222 и 666.

1 Ответ

1 голос
/ 04 июня 2019

Предполагая, что оба ваших запроса возвращают одинаковое количество записей (что является большим предположением), вы можете объединить оба набора данных с помощью идентификатора, созданного с номером строки.Затем вы можете использовать декартово произведение, чтобы вставить столько записей в таблицу, сколько результатов возвращено вашим запросом.

insert into TBL ([Val], [Disp], [Seq], [Active], [DId], [PId])
select [Val], [Disp], [Seq], [Active], cj.Id1, '1111' 
from TBL 
  cross join (
    select rs1.[Id] Id1, rs2.[Id] Id2
    from (    
      select 
        row_number() over (partition by (select null) order by value) rn,
        [Id] 
      from TBL where PId = '123'
    ) rs1
    join (
      select 
        row_number() over (partition by (select null) order by value) rn,
        [Id] 
      from TBL where PId = '456'
    ) rs2
  on rs1.rn=rs2.rn
  ) cj
where PId = '2222' 
  and DId = cj.Id2
...