Создание строк в SELECT на основе INT из другой таблицы - PullRequest
1 голос
/ 06 мая 2020

Допустим, у меня есть таблица с именем «контракты», в которой есть столбец «NumYears».

например.

SELECT 
    ClientId,
    NumYears
FROM Contracts

ClientId NumYears
-------- -----------
123456789    5
987654321    3

У меня есть еще одна таблица «contract_reviews», которая может присоединяться к контрактам. через ClientId.

каждый год пользователя просят просмотреть информацию, хранящуюся в файле, и по завершении вставляет новую строку в 'contract_reviews'

SELECT
    ClientId,
    Reviewed,
    YearFor,
    OtherColumn
FROM Contract_Reviews

ClientId  Reviewed    YearFor OtherColumn
--------- ----------- ------- -----------
123456789 1           2018    '£100'
123456789 1           2019    '£100'

Клиент '123456789' может находиться в второй год, поэтому "contract_reviews" будет содержать только 2 записи. К концу NumYears мы должны ожидать 5.

В принципе, мне нужно выбрать все строки из «contract_reviews» и сгенерировать новые пустые строки для отсутствующих «contract_reviews» до счетчика «NumYears».

ClientId  Reviewed    YearFor OtherColumn
--------- ----------- ------- -----------
123456789 1           2018    '£100'
123456789 1           2019    '£100'
123456789 0           NULL    NULL
123456789 0           NULL    NULL
123456789 0           NULL    NULL

Этот вопрос Количество повторяющихся строк (x) в таблице предложили некоторую помощь, но решение все еще ускользает от меня.

1 Ответ

3 голосов
/ 06 мая 2020

Один из вариантов - использовать рекурсивный запрос:

with cte as (
    select 
        c.clientId, 
        c.numYears - (
            select count(*) from contract_reviews cr where cr.clientId = c.clientId
        ) numYears
    from contracts c
    union all
    select clientId, numYears - 1 from cte where numYears > 1
)
insert into contract_reviews(clientId) 
select clientId from cte

Якорь рекурсивного cte вычисляет, сколько строк «отсутствует» в таблице обзора для каждого клиента, а затем рекурсивная часть генерирует их. Наконец, внешний запрос выполняет вставки.

Демонстрация на DB Fiddle - после выполнения запроса содержимое таблицы обзора:

ClientId  | Reviewed | YearFor | OtherColumn
:-------- | :------- | :------ | :----------
123456789 | 1        | 2018    | £100      
123456789 | 1        | 2019    | £100      
123456789 | <em>null</em>     | <em>null</em>    | <em>null</em>       
123456789 | <em>null</em>     | <em>null</em>    | <em>null</em>       
123456789 | <em>null</em>     | <em>null</em>    | <em>null</em>       
987654321 | <em>null</em>     | <em>null</em>    | <em>null</em>       
987654321 | <em>null</em>     | <em>null</em>    | <em>null</em>       
987654321 | <em>null</em>     | <em>null</em>    | <em>null</em>       
...