Выполнение цикла через таблицу SQL для создания новой таблицы на основе данных другой таблицы

#sql #database #loops #iteration

Вопрос:

Есть ли в SQL какой-либо способ просмотреть таблицу и создать новую таблицу на основе данных из другой таблицы?

Я не знаком с T-SQL, который возвращался во многих моих поисках по этой теме, но мне было интересно, есть ли способ сделать это на обычном SQL?

Вот пример двух таблиц, которые у меня есть: Счет и СОБЫТИЕ

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

Пример таблиц:

введите описание изображения здесь

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

  1. Просмотрите каждый счет-фактуру и получите идентификатор компании, дату счета-фактуры
  2. Пройдите по таблице СОБЫТИЙ, где идентификатор компании = текущий идентификатор компании
  3. Получите самое последнее СОБЫТИЕ до даты выставления счета
  4. Поместите эту информацию в новую таблицу

Ответ №1:

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

Ваши запросы будут выполняться строка за строкой, когда это необходимо.

Вот пример с ПЕРЕКРЕСТНЫМ ПРИМЕНЕНИЕМ, но решение подзапроса или row_number() дало бы тот же результат.

 with invoice(invoice_date) as (
select cast('2021-01-10' as date)
) --sample data

, event(event_date) as (
select cast('2021-01-08' as date)
union all select cast('2021-01-11' as date)
union all select cast('2021-01-09' as date)
) --sample data

SELECT Invoice.invoice_date
--other fields here
, e.event_date as last_event_date

FROM Invoice
CROSS APPLY(
    SELECT TOP 1 event_date
    FROM event
    WHERE event_date <= invoice_date
    ORDER BY event_date DESC
)e
 

Комментарии:

1. Будет ли это работать для больших наборов данных? Например, когда вы назначаете даты — что делать, если я не знаю даты заранее?

2. Даты-это всего лишь примерные данные, чтобы их можно было воспроизвести, поскольку они не были указаны в вопросе. То, что вам понадобится, находится в конце.