ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Сохранение результатов SQL запроса во временной таблице

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для того чтобы сохранить результат запроса во временной таблице, воспользуйтесь командой SELECT INTO, позволяющей создать и заполнить таблицу в одном действии, или INSERT INTO в том случае, если таблица уже была создана. Вот некоторые примеры:

SQL
Скопировать код
-- Нет необходимости разбивать на два этапа, когда можно выполнить все сразу!
SELECT * INTO #TempTable FROM SourceTable WHERE Condition;

-- Иногда мы предпочитаем постепенно накапливать данные, словно наливая кофе в чашку!
INSERT INTO #TempTable (Col1, Col2) SELECT Col1, Col2 FROM SourceTable WHERE Condition;

Первый метод создает новую таблицу #TempTable и затем ее заполняет, а второй — добавляет строки в уже существующую временную таблицу #TempTable.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Подробное рассмотрение временных таблиц

Проверка наличия таблицы

Перед использованием команды SELECT INTO важно удостовериться, что таблица с таким именем не существует. Для этой проверки можно применить следующий SQL-код:

SQL
Скопировать код
-- "Обещания верности."
IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL
    DROP TABLE #TempTable;

-- "Озорная проказа выполнена!"
SELECT * INTO #TempTable FROM SourceTable WHERE Condition;

Использование динамического SQL

Комбинирование динамического 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:

SQL
Скопировать код
-- "Только знающий путь не заблудится."
CREATE TEMPORARY TABLE IF NOT EXISTS TempTable AS
SELECT Col1, Col2 FROM SourceTable WHERE Condition;

Сортировка данных во временных таблицах

Для того чтобы создать временную таблицу с уже отсортированными данными, можно использовать ORDER BY перед INTO:

SQL
Скопировать код
-- Нет смысла откладывать сортировку на позже.
SELECT Col1, Col2 
INTO #TempTable 
FROM SourceTable 
WHERE Condition 
ORDER BY Col1, Col2;

Визуализация

Представим результаты SQL-запроса как свежие продукты (🍅🥕🥬) из магазина:

SQL
Скопировать код
SELECT ingredient FROM fresh_market WHERE quality = 'Excellent'; -- Осторожно, начинаем выбирать!

Теперь подготовка – это настоящее искусство, а временная таблица (#TempTable) — это ваша миска для смешивания:

SQL
Скопировать код
CREATE TABLE #TempTable (ingredient VARCHAR(255)); -- Каждый шеф-повар должен обладать надлежащим инструментарием.

Переходим к смешиванию ингредиентов:

SQL
Скопировать код
INSERT INTO #TempTable (ingredient)
SELECT ingredient FROM fresh_market WHERE quality = 'Excellent'; -- Вот такие вот шалости творятся на кухне данных!

И вот перед нами настоящий шедевр:

Markdown
Скопировать код
Содержимое #TempTable:
| 🍅 | 🥕 | 🥬 |
|----|----|----|

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

Практические советы и предостережения

Выбор между временными таблицами и переменными

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

Откат транзакций с временными таблицами

SQL Server рассматривает временные таблицы как распространенные объекты и откатывает произведенные изменения. Для сохранения данных в временной таблице после отката транзакции, она должна быть подтверждена:

SQL
Скопировать код
-- "Сюрприз!"
BEGIN TRANSACTION;
INSERT INTO #TempTable (Col) VALUES ('Data');
-- Ваша вставка исчезает как призрак...
ROLLBACK; -- Временная таблица теряет данные!

Индексация во имя производительности

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

SQL
Скопировать код
-- "Да пребудет с тобой сила индекса."
CREATE UNIQUE INDEX idx_column1 ON #TempTable (Column1);

Полезные материалы

  1. Временные таблицы в SQL Server – Simple Talk — обзор применения и рекомендаций по работе с временными таблицами в SQL Server.
  2. CREATE TABLE (Transact-SQL) – SQL Server | Microsoft Learn — официальная документация по созданию таблиц, включая временные, в SQL Server.
  3. Table Variable V/S Temporary Table – CodeProject — сравнение таблиц переменных и временных таблиц для лучшего понимания их различий.
  4. java – how to create table if it doesn't exist using Derby Db – Stack Overflow — обсуждение вопроса создания таблиц при их отсутствии на примере Derby DB.
    • YouTube
    — видеоурок по применению временных таблиц в SQL.