#sql #database #loops #iteration
Вопрос:
Есть ли в SQL какой-либо способ просмотреть таблицу и создать новую таблицу на основе данных из другой таблицы?
Я не знаком с T-SQL, который возвращался во многих моих поисках по этой теме, но мне было интересно, есть ли способ сделать это на обычном SQL?
Вот пример двух таблиц, которые у меня есть: Счет и СОБЫТИЕ
Таблица, которую я хочу создать с помощью итерации, является Последним событием для выставления счета.
Пример таблиц:
Я знаю логику здесь, но я не уверен, как добиться этого наилучшим образом в SQL.
- Просмотрите каждый счет-фактуру и получите идентификатор компании, дату счета-фактуры
- Пройдите по таблице СОБЫТИЙ, где идентификатор компании = текущий идентификатор компании
- Получите самое последнее СОБЫТИЕ до даты выставления счета
- Поместите эту информацию в новую таблицу
Ответ №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. Даты-это всего лишь примерные данные, чтобы их можно было воспроизвести, поскольку они не были указаны в вопросе. То, что вам понадобится, находится в конце.