Сохранение результатов SQL запроса во временной таблице
Быстрый ответ
Для того чтобы сохранить результат запроса во временной таблице, воспользуйтесь командой SELECT INTO
, позволяющей создать и заполнить таблицу в одном действии, или INSERT INTO
в том случае, если таблица уже была создана. Вот некоторые примеры:
-- Нет необходимости разбивать на два этапа, когда можно выполнить все сразу!
SELECT * INTO #TempTable FROM SourceTable WHERE Condition;
-- Иногда мы предпочитаем постепенно накапливать данные, словно наливая кофе в чашку!
INSERT INTO #TempTable (Col1, Col2) SELECT Col1, Col2 FROM SourceTable WHERE Condition;
Первый метод создает новую таблицу #TempTable
и затем ее заполняет, а второй — добавляет строки в уже существующую временную таблицу #TempTable
.
Подробное рассмотрение временных таблиц
Проверка наличия таблицы
Перед использованием команды SELECT INTO
важно удостовериться, что таблица с таким именем не существует. Для этой проверки можно применить следующий SQL-код:
-- "Обещания верности."
IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL
DROP TABLE #TempTable;
-- "Озорная проказа выполнена!"
SELECT * INTO #TempTable FROM SourceTable WHERE Condition;
Использование динамического SQL
Комбинирование динамического SQL с использованием временных таблиц представляет собой мощный инструмент, позволяющий проверить наличие таблицы, а затем при его наличии — создать или удалить ее.
-- "Пробуждаясь, меня осеняют невероятные идеи..."
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'IF OBJECT_ID(''tempdb..#TempTable'') IS NOT NULL DROP TABLE #TempTable;
SELECT Col1, Col2 INTO #TempTable FROM SourceTable WHERE Condition';
EXEC sp_executesql @sql;
MySQL и альтернативный подход
В MySQL для создания временной таблицы на основе результата запроса служит конструкция CREATE TABLE ... AS SELECT
:
-- "Только знающий путь не заблудится."
CREATE TEMPORARY TABLE IF NOT EXISTS TempTable AS
SELECT Col1, Col2 FROM SourceTable WHERE Condition;
Сортировка данных во временных таблицах
Для того чтобы создать временную таблицу с уже отсортированными данными, можно использовать ORDER BY
перед INTO
:
-- Нет смысла откладывать сортировку на позже.
SELECT Col1, Col2
INTO #TempTable
FROM SourceTable
WHERE Condition
ORDER BY Col1, Col2;
Визуализация
Представим результаты SQL-запроса как свежие продукты (🍅🥕🥬) из магазина:
SELECT ingredient FROM fresh_market WHERE quality = 'Excellent'; -- Осторожно, начинаем выбирать!
Теперь подготовка – это настоящее искусство, а временная таблица (#TempTable) — это ваша миска для смешивания:
CREATE TABLE #TempTable (ingredient VARCHAR(255)); -- Каждый шеф-повар должен обладать надлежащим инструментарием.
Переходим к смешиванию ингредиентов:
INSERT INTO #TempTable (ingredient)
SELECT ingredient FROM fresh_market WHERE quality = 'Excellent'; -- Вот такие вот шалости творятся на кухне данных!
И вот перед нами настоящий шедевр:
Содержимое #TempTable:
| 🍅 | 🥕 | 🥬 |
|----|----|----|
Как вкусное блюдо, временные таблицы позволяют сохранить ваши данные для последующего использования.
Практические советы и предостережения
Выбор между временными таблицами и переменными
При выборе между временными таблицами и переменными следует учитывать область видимости, производительность запросов и возможность индексации. Временные таблицы наиболее эффективны при работе с большими объемами данных и сложными операциями. При меньших задачах преимущество отдается переменным таблицам.
Откат транзакций с временными таблицами
SQL Server рассматривает временные таблицы как распространенные объекты и откатывает произведенные изменения. Для сохранения данных в временной таблице после отката транзакции, она должна быть подтверждена:
-- "Сюрприз!"
BEGIN TRANSACTION;
INSERT INTO #TempTable (Col) VALUES ('Data');
-- Ваша вставка исчезает как призрак...
ROLLBACK; -- Временная таблица теряет данные!
Индексация во имя производительности
Индексация временных таблиц может значительно улучшить производительность запросов. Однако важно найти баланс между ускорением выполнения и затратами на поддержание индексов:
-- "Да пребудет с тобой сила индекса."
CREATE UNIQUE INDEX idx_column1 ON #TempTable (Column1);
Полезные материалы
- Временные таблицы в SQL Server – Simple Talk — обзор применения и рекомендаций по работе с временными таблицами в SQL Server.
- CREATE TABLE (Transact-SQL) – SQL Server | Microsoft Learn — официальная документация по созданию таблиц, включая временные, в SQL Server.
- Table Variable V/S Temporary Table – CodeProject — сравнение таблиц переменных и временных таблиц для лучшего понимания их различий.
- java – how to create table if it doesn't exist using Derby Db – Stack Overflow — обсуждение вопроса создания таблиц при их отсутствии на примере Derby DB.
- YouTube