Временные таблицы в языке запрпосов DaJet можно создать только из выборки при помощи команды SELECT. Для MS SQL Server возможно создание табличных переменных (смотри пример ниже). Синтаксис создания табличных переменных для базы данных PostgreSQL будет интерпретирован как создание обычной временной таблицы.
Особенности использования табличных переменных MS SQL Server следует смотреть в документации Microsoft по соответствующему продукту. Здесь же коротко отметим, что табличные переменные также, как и временные таблицы, используют tempdb, но при этом их использование не создаёт нагрузки на журнал транзакций, а, следовательно, данные в табличных переменных не защищены транзакционными механизмами, то есть в случае отката транзакции данные табличной переменной не восстанавливаются в том состоянии, в котором они были до начала этой транзакции.
-- Создание временной таблицы
CREATE TEMPORARY TABLE ИмяВременнойТаблицы AS ...
-- Создание табличной переменной
CREATE TABLE VARIABLE ИмяТабличнойПеременной AS ...
По отношению к временным таблицам и табличным переменным возможно применение команд DML, а именно INSERT, UPDATE, DELETE. Например, временную таблицу можно очистить следующим образом:
-- Полная очистка
DELETE ВременнаяТаблица
-- Частичная очистка по условию
DELETE ВременнаяТаблица WHERE СуммаОстатка > 100
Пример создания и использования временной таблицы:
DECLARE @ДатаСреза datetime = '2021-07-31T23:59:59';
DECLARE @Рубль Справочник.Валюты = '9c556d4d-720f-11df-b436-0015e92f2802';
DECLARE @Оптовая Справочник.ВидыЦен = '73867e74-73c8-11df-b338-0011955cba6b';
CREATE TEMPORARY TABLE АктуальныеЦены AS -- Временная таблица
(
SELECT Товар.Ссылка, Товар.Код, Товар.Наименование, Товар.СтавкаНДС,
АктуальныйПериод.Период, ЦенаТовара.Цена, ЦенаТовара.ВидЦены
FROM Справочник.Номенклатура AS Товар
INNER JOIN (SELECT Номенклатура, MAX(Период) AS Период
FROM РегистрСведений.ЦеныНоменклатуры
WHERE Валюта = @Рубль
AND Период <= @ДатаСреза
GROUP BY Номенклатура) AS АктуальныйПериод
ON Товар.Ссылка = АктуальныйПериод.Номенклатура
INNER JOIN РегистрСведений.ЦеныНоменклатуры AS ЦенаТовара
ON ЦенаТовара.Период = АктуальныйПериод.Период
AND ЦенаТовара.Номенклатура = АктуальныйПериод.Номенклатура
WHERE ЦенаТовара.ВидЦены = @Оптовая AND ЦенаТовара.Цена > 0
)
-- Конец объявления и создания временной таблицы
SELECT АЦ.Ссылка, АЦ.Код, АЦ.Наименование,
АЦ.СтавкаНДС, АЦ.Период, АЦ.Цена, АЦ.ВидЦены
FROM АктуальныеЦены AS АЦ
DECLARE @ДатаОстатка datetime = '2014-12-31T23:59:59';
CREATE TABLE VARIABLE Остатки AS -- Табличная переменная
(
SELECT Период, Номенклатура,
SUM(CASE WHEN ВидДвижения = 0 -- Приход
THEN ВНаличии
ELSE -ВНаличии END) AS Сумма
FROM РегистрНакопления.ТоварыНаСкладах
WHERE Период <= @ДатаОстатка
GROUP BY Период, Номенклатура
HAVING SUM(CASE WHEN ВидДвижения = 0 -- Приход
THEN ВНаличии
ELSE -ВНаличии END) >= 50
)
-- Конец объявления и создания табличной переменной
SELECT Период, Товар.Наименование, Сумма
FROM Остатки AS Остатки
INNER JOIN Справочник.Номенклатура AS Товар
ON Остатки.Номенклатура = Товар.Ссылка